mirror of https://github.com/axmolengine/axmol.git
fixed #1547:set selected menu item to null when it is removed from a menu
This commit is contained in:
parent
cc2865e294
commit
a7dca5c05a
|
@ -178,15 +178,32 @@ void CCMenu::addChild(CCNode * child, int zOrder, int tag)
|
||||||
void CCMenu::onExit()
|
void CCMenu::onExit()
|
||||||
{
|
{
|
||||||
if (m_eState == kCCMenuStateTrackingTouch)
|
if (m_eState == kCCMenuStateTrackingTouch)
|
||||||
|
{
|
||||||
|
if (m_pSelectedItem)
|
||||||
{
|
{
|
||||||
m_pSelectedItem->unselected();
|
m_pSelectedItem->unselected();
|
||||||
m_eState = kCCMenuStateWaiting;
|
|
||||||
m_pSelectedItem = NULL;
|
m_pSelectedItem = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_eState = kCCMenuStateWaiting;
|
||||||
|
}
|
||||||
|
|
||||||
CCLayer::onExit();
|
CCLayer::onExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CCMenu::removeChild(CCNode* child, bool cleanup)
|
||||||
|
{
|
||||||
|
CCMenuItem *pMenuItem = dynamic_cast<CCMenuItem*>(child);
|
||||||
|
CCAssert(pMenuItem != NULL, "Menu only supports MenuItem objects as children");
|
||||||
|
|
||||||
|
if (m_pSelectedItem == pMenuItem)
|
||||||
|
{
|
||||||
|
m_pSelectedItem = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
CCNode::removeChild(child, cleanup);
|
||||||
|
}
|
||||||
|
|
||||||
//Menu - Events
|
//Menu - Events
|
||||||
|
|
||||||
void CCMenu::setHandlerPriority(int newPriority)
|
void CCMenu::setHandlerPriority(int newPriority)
|
||||||
|
|
|
@ -125,6 +125,7 @@ public:
|
||||||
virtual void addChild(CCNode * child, int zOrder);
|
virtual void addChild(CCNode * child, int zOrder);
|
||||||
virtual void addChild(CCNode * child, int zOrder, int tag);
|
virtual void addChild(CCNode * child, int zOrder, int tag);
|
||||||
virtual void registerWithTouchDispatcher();
|
virtual void registerWithTouchDispatcher();
|
||||||
|
virtual void removeChild(CCNode* child, bool cleanup);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief For phone event handle functions
|
@brief For phone event handle functions
|
||||||
|
|
|
@ -68,12 +68,15 @@ MenuLayerMainMenu::MenuLayerMainMenu()
|
||||||
// Font Item
|
// Font Item
|
||||||
CCMenuItemFont* item8 = CCMenuItemFont::create("Quit", this, menu_selector(MenuLayerMainMenu::onQuit));
|
CCMenuItemFont* item8 = CCMenuItemFont::create("Quit", this, menu_selector(MenuLayerMainMenu::onQuit));
|
||||||
|
|
||||||
|
CCMenuItemFont* item9 = CCMenuItemFont::create("Remove menu item when moving", this,
|
||||||
|
menu_selector(MenuLayerMainMenu::menuMovingCallback));
|
||||||
|
|
||||||
CCActionInterval* color_action = CCTintBy::create(0.5f, 0, -255, -255);
|
CCActionInterval* color_action = CCTintBy::create(0.5f, 0, -255, -255);
|
||||||
CCActionInterval* color_back = color_action->reverse();
|
CCActionInterval* color_back = color_action->reverse();
|
||||||
CCSequence* seq = CCSequence::create(color_action, color_back, NULL);
|
CCSequence* seq = CCSequence::create(color_action, color_back, NULL);
|
||||||
item8->runAction(CCRepeatForever::create(seq));
|
item8->runAction(CCRepeatForever::create(seq));
|
||||||
|
|
||||||
CCMenu* menu = CCMenu::create( item1, item2, item3, item4, item5, item6, item7, item8, NULL);
|
CCMenu* menu = CCMenu::create( item1, item2, item3, item4, item5, item6, item7, item8, item9, NULL);
|
||||||
menu->alignItemsVertically();
|
menu->alignItemsVertically();
|
||||||
|
|
||||||
|
|
||||||
|
@ -185,6 +188,11 @@ void MenuLayerMainMenu::onQuit(CCObject* sender)
|
||||||
//getCocosApp()->exit();
|
//getCocosApp()->exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MenuLayerMainMenu::menuMovingCallback(CCObject *pSender)
|
||||||
|
{
|
||||||
|
((CCLayerMultiplex*)m_pParent)->switchTo(6);
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// MenuLayer2
|
// MenuLayer2
|
||||||
|
@ -571,6 +579,58 @@ void BugsTest::backMenuCallback(cocos2d::CCObject *pSender)
|
||||||
((CCLayerMultiplex*)m_pParent)->switchTo(0);
|
((CCLayerMultiplex*)m_pParent)->switchTo(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RemoveMenuItemWhenMove::RemoveMenuItemWhenMove()
|
||||||
|
{
|
||||||
|
CCSize s = CCDirector::sharedDirector()->getWinSize();
|
||||||
|
|
||||||
|
CCLabelTTF* label = CCLabelTTF::create("click item and move, should not crash", "Arial", 20);
|
||||||
|
label->setPosition(ccp(s.width/2, s.height - 30));
|
||||||
|
addChild(label);
|
||||||
|
|
||||||
|
item = CCMenuItemFont::create("item 1");
|
||||||
|
item->retain();
|
||||||
|
|
||||||
|
CCMenuItemFont *back = CCMenuItemFont::create("go back", this, menu_selector(RemoveMenuItemWhenMove::goBack));
|
||||||
|
|
||||||
|
CCMenu *menu = CCMenu::create(item, back, NULL);
|
||||||
|
addChild(menu);
|
||||||
|
menu->alignItemsVertically();
|
||||||
|
|
||||||
|
menu->setPosition(ccp(s.width/2, s.height/2));
|
||||||
|
|
||||||
|
setTouchEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveMenuItemWhenMove::goBack(CCObject *pSender)
|
||||||
|
{
|
||||||
|
((CCLayerMultiplex*)m_pParent)->switchTo(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
RemoveMenuItemWhenMove::~RemoveMenuItemWhenMove()
|
||||||
|
{
|
||||||
|
CC_SAFE_RELEASE(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveMenuItemWhenMove::registerWithTouchDispatcher(void)
|
||||||
|
{
|
||||||
|
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -129, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RemoveMenuItemWhenMove::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveMenuItemWhenMove::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
|
||||||
|
{
|
||||||
|
if (item)
|
||||||
|
{
|
||||||
|
item->removeFromParentAndCleanup(true);
|
||||||
|
item->release();
|
||||||
|
item = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MenuTestScene::runThisTest()
|
void MenuTestScene::runThisTest()
|
||||||
{
|
{
|
||||||
CCLayer* pLayer1 = new MenuLayerMainMenu();
|
CCLayer* pLayer1 = new MenuLayerMainMenu();
|
||||||
|
@ -579,8 +639,9 @@ void MenuTestScene::runThisTest()
|
||||||
CCLayer* pLayer4 = new MenuLayer4();
|
CCLayer* pLayer4 = new MenuLayer4();
|
||||||
CCLayer* pLayer5 = new MenuLayerPriorityTest();
|
CCLayer* pLayer5 = new MenuLayerPriorityTest();
|
||||||
CCLayer* pLayer6 = new BugsTest();
|
CCLayer* pLayer6 = new BugsTest();
|
||||||
|
CCLayer* pLayer7 = new RemoveMenuItemWhenMove();
|
||||||
|
|
||||||
CCLayerMultiplex* layer = CCLayerMultiplex::create(pLayer1, pLayer2, pLayer3, pLayer4, pLayer5, pLayer6, NULL);
|
CCLayerMultiplex* layer = CCLayerMultiplex::create(pLayer1, pLayer2, pLayer3, pLayer4, pLayer5, pLayer6, pLayer7, NULL);
|
||||||
addChild(layer, 0);
|
addChild(layer, 0);
|
||||||
|
|
||||||
pLayer1->release();
|
pLayer1->release();
|
||||||
|
@ -589,6 +650,7 @@ void MenuTestScene::runThisTest()
|
||||||
pLayer4->release();
|
pLayer4->release();
|
||||||
pLayer5->release();
|
pLayer5->release();
|
||||||
pLayer6->release();
|
pLayer6->release();
|
||||||
|
pLayer7->release();
|
||||||
|
|
||||||
CCDirector::sharedDirector()->replaceScene(this);
|
CCDirector::sharedDirector()->replaceScene(this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ public:
|
||||||
void menuCallbackPriorityTest(CCObject* pSender);
|
void menuCallbackPriorityTest(CCObject* pSender);
|
||||||
void menuCallbackBugsTest(CCObject *pSender);
|
void menuCallbackBugsTest(CCObject *pSender);
|
||||||
void onQuit(CCObject* pSender);
|
void onQuit(CCObject* pSender);
|
||||||
|
void menuMovingCallback(CCObject *pSender);
|
||||||
|
|
||||||
//CREATE_NODE(MenuLayer1);
|
//CREATE_NODE(MenuLayer1);
|
||||||
};
|
};
|
||||||
|
@ -109,6 +110,22 @@ public:
|
||||||
void backMenuCallback(CCObject *pSender);
|
void backMenuCallback(CCObject *pSender);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class RemoveMenuItemWhenMove : public CCLayer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RemoveMenuItemWhenMove();
|
||||||
|
~RemoveMenuItemWhenMove();
|
||||||
|
|
||||||
|
virtual void registerWithTouchDispatcher(void);
|
||||||
|
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
|
||||||
|
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
|
||||||
|
|
||||||
|
void goBack(CCObject *pSender);
|
||||||
|
|
||||||
|
private:
|
||||||
|
CCMenuItemFont *item;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class MenuTestScene : public TestScene
|
class MenuTestScene : public TestScene
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue