1
0

CCMenuItem.cpp 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  1. /****************************************************************************
  2. Copyright (c) 2008-2010 Ricardo Quesada
  3. Copyright (c) 2010-2012 cocos2d-x.org
  4. Copyright (c) 2011 Zynga Inc.
  5. Copyright (c) 2013-2017 Chukong Technologies Inc.
  6. http://www.cocos2d-x.org
  7. Permission is hereby granted, free of charge, to any person obtaining a copy
  8. of this software and associated documentation files (the "Software"), to deal
  9. in the Software without restriction, including without limitation the rights
  10. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. copies of the Software, and to permit persons to whom the Software is
  12. furnished to do so, subject to the following conditions:
  13. The above copyright notice and this permission notice shall be included in
  14. all copies or substantial portions of the Software.
  15. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. THE SOFTWARE.
  22. ****************************************************************************/
  23. #include "2d/CCMenuItem.h"
  24. #include "2d/CCActionInterval.h"
  25. #include "2d/CCSprite.h"
  26. #include "2d/CCLabelAtlas.h"
  27. #include "2d/CCLabel.h"
  28. #include "base/ccUTF8.h"
  29. #include <stdarg.h>
  30. NS_CC_BEGIN
  31. static int _globalFontSize = kItemSize;
  32. static std::string _globalFontName = "Marker Felt";
  33. static bool _globalFontNameRelease = false;
  34. const unsigned int kZoomActionTag = 0xc0c05002;
  35. //
  36. // MenuItem
  37. //
  38. MenuItem* MenuItem::create()
  39. {
  40. return MenuItem::create((const ccMenuCallback&)nullptr);
  41. }
  42. // FIXME: deprecated
  43. MenuItem* MenuItem::create(Ref *target, SEL_MenuHandler selector)
  44. {
  45. MenuItem *ret = new (std::nothrow) MenuItem();
  46. ret->initWithCallback(std::bind(selector, target, std::placeholders::_1));
  47. ret->autorelease();
  48. return ret;
  49. }
  50. MenuItem* MenuItem::create( const ccMenuCallback& callback)
  51. {
  52. MenuItem *ret = new (std::nothrow) MenuItem();
  53. ret->initWithCallback(callback);
  54. ret->autorelease();
  55. return ret;
  56. }
  57. // FIXME: deprecated
  58. bool MenuItem::initWithTarget(cocos2d::Ref *target, SEL_MenuHandler selector )
  59. {
  60. return initWithCallback( std::bind(selector,target, std::placeholders::_1) );
  61. }
  62. bool MenuItem::initWithCallback(const ccMenuCallback& callback)
  63. {
  64. setAnchorPoint(Vec2(0.5f, 0.5f));
  65. _callback = callback;
  66. _enabled = true;
  67. _selected = false;
  68. return true;
  69. }
  70. MenuItem::~MenuItem()
  71. {
  72. }
  73. void MenuItem::selected()
  74. {
  75. _selected = true;
  76. }
  77. void MenuItem::unselected()
  78. {
  79. _selected = false;
  80. }
  81. void MenuItem::activate()
  82. {
  83. if (_enabled)
  84. {
  85. if( _callback )
  86. {
  87. _callback(this);
  88. }
  89. #if CC_ENABLE_SCRIPT_BINDING
  90. if (kScriptTypeLua == _scriptType)
  91. {
  92. BasicScriptData data(this);
  93. ScriptEvent scriptEvent(kMenuClickedEvent, &data);
  94. ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&scriptEvent);
  95. }
  96. #endif
  97. }
  98. }
  99. void MenuItem::setEnabled(bool enabled)
  100. {
  101. _enabled = enabled;
  102. }
  103. bool MenuItem::isEnabled() const
  104. {
  105. return _enabled;
  106. }
  107. Rect MenuItem::rect() const
  108. {
  109. return Rect( _position.x - _contentSize.width * _anchorPoint.x,
  110. _position.y - _contentSize.height * _anchorPoint.y,
  111. _contentSize.width, _contentSize.height);
  112. }
  113. bool MenuItem::isSelected() const
  114. {
  115. return _selected;
  116. }
  117. // FIXME: deprecated
  118. void MenuItem::setTarget(Ref *target, SEL_MenuHandler selector)
  119. {
  120. setCallback( std::bind( selector, target, std::placeholders::_1) );
  121. }
  122. void MenuItem::setCallback(const ccMenuCallback& callback)
  123. {
  124. _callback = callback;
  125. }
  126. std::string MenuItem::getDescription() const
  127. {
  128. return StringUtils::format("<MenuItem | tag = %d>", _tag);
  129. }
  130. //
  131. //CCMenuItemLabel
  132. //
  133. void MenuItemLabel::setLabel(Node* var)
  134. {
  135. if (var)
  136. {
  137. var->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
  138. setContentSize(var->getContentSize());
  139. addChild(var);
  140. }
  141. if (_label)
  142. {
  143. removeChild(_label, true);
  144. }
  145. _label = var;
  146. }
  147. // FIXME:: deprecated
  148. MenuItemLabel * MenuItemLabel::create(Node*label, Ref* target, SEL_MenuHandler selector)
  149. {
  150. MenuItemLabel *ret = new (std::nothrow) MenuItemLabel();
  151. ret->initWithLabel(label, std::bind(selector, target, std::placeholders::_1));
  152. ret->autorelease();
  153. return ret;
  154. }
  155. MenuItemLabel * MenuItemLabel::create(Node*label, const ccMenuCallback& callback)
  156. {
  157. MenuItemLabel *ret = new (std::nothrow) MenuItemLabel();
  158. ret->initWithLabel(label, callback);
  159. ret->autorelease();
  160. return ret;
  161. }
  162. MenuItemLabel* MenuItemLabel::create(Node *label)
  163. {
  164. MenuItemLabel *ret = new (std::nothrow) MenuItemLabel();
  165. ret->initWithLabel(label, (const ccMenuCallback&) nullptr);
  166. ret->autorelease();
  167. return ret;
  168. }
  169. // FIXME:: deprecated
  170. bool MenuItemLabel::initWithLabel(Node* label, Ref* target, SEL_MenuHandler selector)
  171. {
  172. return initWithLabel(label, std::bind(selector,target, std::placeholders::_1) );
  173. }
  174. bool MenuItemLabel::initWithLabel(Node* label, const ccMenuCallback& callback)
  175. {
  176. MenuItem::initWithCallback(callback);
  177. _originalScale = 1.0f;
  178. _colorBackup = Color3B::WHITE;
  179. setDisabledColor(Color3B(126,126,126));
  180. this->setLabel(label);
  181. setCascadeColorEnabled(true);
  182. setCascadeOpacityEnabled(true);
  183. return true;
  184. }
  185. MenuItemLabel::~MenuItemLabel()
  186. {
  187. }
  188. void MenuItemLabel::setString(const std::string& label)
  189. {
  190. dynamic_cast<LabelProtocol*>(_label)->setString(label);
  191. this->setContentSize(_label->getContentSize());
  192. }
  193. std::string MenuItemLabel::getString() const
  194. {
  195. auto label = dynamic_cast<LabelProtocol*>(_label);
  196. return label->getString();
  197. }
  198. void MenuItemLabel::activate()
  199. {
  200. if(_enabled)
  201. {
  202. this->stopAllActions();
  203. this->setScale( _originalScale );
  204. MenuItem::activate();
  205. }
  206. }
  207. void MenuItemLabel::selected()
  208. {
  209. // subclass to change the default action
  210. if(_enabled)
  211. {
  212. MenuItem::selected();
  213. Action *action = getActionByTag(kZoomActionTag);
  214. if (action)
  215. {
  216. this->stopAction(action);
  217. }
  218. else
  219. {
  220. _originalScale = this->getScale();
  221. }
  222. Action *zoomAction = ScaleTo::create(0.1f, _originalScale * 1.2f);
  223. zoomAction->setTag(kZoomActionTag);
  224. this->runAction(zoomAction);
  225. }
  226. }
  227. void MenuItemLabel::unselected()
  228. {
  229. // subclass to change the default action
  230. if(_enabled)
  231. {
  232. MenuItem::unselected();
  233. this->stopActionByTag(kZoomActionTag);
  234. Action *zoomAction = ScaleTo::create(0.1f, _originalScale);
  235. zoomAction->setTag(kZoomActionTag);
  236. this->runAction(zoomAction);
  237. }
  238. }
  239. void MenuItemLabel::setEnabled(bool enabled)
  240. {
  241. if( _enabled != enabled )
  242. {
  243. if(enabled == false)
  244. {
  245. _colorBackup = this->getColor();
  246. this->setColor(_disabledColor);
  247. }
  248. else
  249. {
  250. this->setColor(_colorBackup);
  251. }
  252. }
  253. MenuItem::setEnabled(enabled);
  254. }
  255. //
  256. //CCMenuItemAtlasFont
  257. //
  258. MenuItemAtlasFont * MenuItemAtlasFont::create(const std::string& value, const std::string& charMapFile, int itemWidth, int itemHeight, char startCharMap)
  259. {
  260. return MenuItemAtlasFont::create(value, charMapFile, itemWidth, itemHeight, startCharMap, (const ccMenuCallback&)nullptr);
  261. }
  262. // FIXME:: deprecated
  263. MenuItemAtlasFont * MenuItemAtlasFont::create(const std::string& value, const std::string& charMapFile, int itemWidth, int itemHeight, char startCharMap, Ref* target, SEL_MenuHandler selector)
  264. {
  265. MenuItemAtlasFont *ret = new (std::nothrow) MenuItemAtlasFont();
  266. ret->initWithString(value, charMapFile, itemWidth, itemHeight, startCharMap, std::bind(selector, target, std::placeholders::_1));
  267. ret->autorelease();
  268. return ret;
  269. }
  270. MenuItemAtlasFont * MenuItemAtlasFont::create(const std::string& value, const std::string& charMapFile, int itemWidth, int itemHeight, char startCharMap, const ccMenuCallback& callback)
  271. {
  272. MenuItemAtlasFont *ret = new (std::nothrow) MenuItemAtlasFont();
  273. ret->initWithString(value, charMapFile, itemWidth, itemHeight, startCharMap, callback);
  274. ret->autorelease();
  275. return ret;
  276. }
  277. // FIXME:: deprecated
  278. bool MenuItemAtlasFont::initWithString(const std::string& value, const std::string& charMapFile, int itemWidth, int itemHeight, char startCharMap, Ref* target, SEL_MenuHandler selector)
  279. {
  280. return initWithString(value, charMapFile, itemWidth, itemHeight, startCharMap, std::bind(selector,target, std::placeholders::_1) );
  281. }
  282. bool MenuItemAtlasFont::initWithString(const std::string& value, const std::string& charMapFile, int itemWidth, int itemHeight, char startCharMap, const ccMenuCallback& callback)
  283. {
  284. CCASSERT( value.size() != 0, "value length must be greater than 0");
  285. LabelAtlas *label = LabelAtlas::create();
  286. label->initWithString(value, charMapFile, itemWidth, itemHeight, startCharMap);
  287. if (MenuItemLabel::initWithLabel(label, callback))
  288. {
  289. // do something ?
  290. }
  291. return true;
  292. }
  293. //
  294. //CCMenuItemFont
  295. //
  296. void MenuItemFont::setFontSize(int s)
  297. {
  298. _globalFontSize = s;
  299. }
  300. int MenuItemFont::getFontSize()
  301. {
  302. return _globalFontSize;
  303. }
  304. void MenuItemFont::setFontName(const std::string& name)
  305. {
  306. if (_globalFontNameRelease)
  307. {
  308. _globalFontName.clear();
  309. }
  310. _globalFontName = name;
  311. _globalFontNameRelease = true;
  312. }
  313. const std::string& MenuItemFont::getFontName()
  314. {
  315. return _globalFontName;
  316. }
  317. // FIXME:: deprecated
  318. MenuItemFont * MenuItemFont::create(const std::string& value, Ref* target, SEL_MenuHandler selector)
  319. {
  320. MenuItemFont *ret = new (std::nothrow) MenuItemFont();
  321. ret->initWithString(value, std::bind(selector, target, std::placeholders::_1));
  322. ret->autorelease();
  323. return ret;
  324. }
  325. MenuItemFont * MenuItemFont::create(const std::string& value, const ccMenuCallback& callback)
  326. {
  327. MenuItemFont *ret = new (std::nothrow) MenuItemFont();
  328. ret->initWithString(value, callback);
  329. ret->autorelease();
  330. return ret;
  331. }
  332. MenuItemFont * MenuItemFont::create(const std::string& value)
  333. {
  334. MenuItemFont *ret = new (std::nothrow) MenuItemFont();
  335. ret->initWithString(value, (const ccMenuCallback&)nullptr);
  336. ret->autorelease();
  337. return ret;
  338. }
  339. MenuItemFont::MenuItemFont()
  340. : _fontSize(0), _fontName("")
  341. {}
  342. MenuItemFont::~MenuItemFont()
  343. {
  344. CCLOGINFO("In the destructor of MenuItemFont (%p).", this);
  345. }
  346. // FIXME:: deprecated
  347. bool MenuItemFont::initWithString(const std::string& value, Ref* target, SEL_MenuHandler selector)
  348. {
  349. CCASSERT( !value.empty(), "Value length must be greater than 0");
  350. return initWithString(value, std::bind(selector,target, std::placeholders::_1) );
  351. }
  352. bool MenuItemFont::initWithString(const std::string& value, const ccMenuCallback& callback)
  353. {
  354. CCASSERT( !value.empty(), "Value length must be greater than 0");
  355. _fontName = _globalFontName;
  356. _fontSize = _globalFontSize;
  357. Label *label = Label::createWithSystemFont(value, _fontName, _fontSize);
  358. if (MenuItemLabel::initWithLabel(label, callback))
  359. {
  360. // do something ?
  361. }
  362. return true;
  363. }
  364. void MenuItemFont::setFontSizeObj(int s)
  365. {
  366. _fontSize = s;
  367. dynamic_cast<Label*>(_label)->setSystemFontSize(_fontSize);
  368. this->setContentSize(dynamic_cast<Label*>(_label)->getContentSize());
  369. }
  370. int MenuItemFont::getFontSizeObj() const
  371. {
  372. return _fontSize;
  373. }
  374. void MenuItemFont::setFontNameObj(const std::string& name)
  375. {
  376. _fontName = name;
  377. dynamic_cast<Label*>(_label)->setSystemFontName(_fontName);
  378. this->setContentSize(dynamic_cast<Label*>(_label)->getContentSize());
  379. }
  380. const std::string& MenuItemFont::getFontNameObj() const
  381. {
  382. return _fontName;
  383. }
  384. //
  385. //CCMenuItemSprite
  386. //
  387. void MenuItemSprite::setNormalImage(Node* image)
  388. {
  389. if (image != _normalImage)
  390. {
  391. if (image)
  392. {
  393. addChild(image);
  394. image->setAnchorPoint(Vec2(0, 0));
  395. }
  396. if (_normalImage)
  397. {
  398. removeChild(_normalImage, true);
  399. }
  400. _normalImage = image;
  401. if (_normalImage != nullptr)
  402. {
  403. this->setContentSize(_normalImage->getContentSize());
  404. }
  405. this->updateImagesVisibility();
  406. }
  407. }
  408. void MenuItemSprite::setSelectedImage(Node* image)
  409. {
  410. if (image != _normalImage)
  411. {
  412. if (image)
  413. {
  414. addChild(image);
  415. image->setAnchorPoint(Vec2(0, 0));
  416. }
  417. if (_selectedImage)
  418. {
  419. removeChild(_selectedImage, true);
  420. }
  421. _selectedImage = image;
  422. this->updateImagesVisibility();
  423. }
  424. }
  425. void MenuItemSprite::setDisabledImage(Node* image)
  426. {
  427. if (image != _normalImage)
  428. {
  429. if (image)
  430. {
  431. addChild(image);
  432. image->setAnchorPoint(Vec2(0, 0));
  433. }
  434. if (_disabledImage)
  435. {
  436. removeChild(_disabledImage, true);
  437. }
  438. _disabledImage = image;
  439. this->updateImagesVisibility();
  440. }
  441. }
  442. //
  443. //CCMenuItemSprite
  444. //
  445. MenuItemSprite * MenuItemSprite::create(Node* normalSprite, Node* selectedSprite, Node* disabledSprite)
  446. {
  447. return MenuItemSprite::create(normalSprite, selectedSprite, disabledSprite, (const ccMenuCallback&)nullptr);
  448. }
  449. // FIXME: deprecated
  450. MenuItemSprite * MenuItemSprite::create(Node* normalSprite, Node* selectedSprite, Ref* target, SEL_MenuHandler selector)
  451. {
  452. return MenuItemSprite::create(normalSprite, selectedSprite, nullptr, std::bind(selector, target, std::placeholders::_1));
  453. }
  454. MenuItemSprite * MenuItemSprite::create(Node* normalSprite, Node* selectedSprite, const ccMenuCallback& callback)
  455. {
  456. return MenuItemSprite::create(normalSprite, selectedSprite, nullptr, callback);
  457. }
  458. // FIXME: deprecated
  459. MenuItemSprite * MenuItemSprite::create(Node *normalSprite, Node *selectedSprite, Node *disabledSprite, Ref *target, SEL_MenuHandler selector)
  460. {
  461. MenuItemSprite *ret = new (std::nothrow) MenuItemSprite();
  462. ret->initWithNormalSprite(normalSprite, selectedSprite, disabledSprite, std::bind(selector, target, std::placeholders::_1));
  463. ret->autorelease();
  464. return ret;
  465. }
  466. MenuItemSprite * MenuItemSprite::create(Node *normalSprite, Node *selectedSprite, Node *disabledSprite, const ccMenuCallback& callback)
  467. {
  468. MenuItemSprite *ret = new (std::nothrow) MenuItemSprite();
  469. ret->initWithNormalSprite(normalSprite, selectedSprite, disabledSprite, callback);
  470. ret->autorelease();
  471. return ret;
  472. }
  473. // FIXME: deprecated
  474. bool MenuItemSprite::initWithNormalSprite(Node* normalSprite, Node* selectedSprite, Node* disabledSprite, Ref* target, SEL_MenuHandler selector)
  475. {
  476. return initWithNormalSprite(normalSprite, selectedSprite, disabledSprite, std::bind(selector,target, std::placeholders::_1) );
  477. }
  478. bool MenuItemSprite::initWithNormalSprite(Node* normalSprite, Node* selectedSprite, Node* disabledSprite, const ccMenuCallback& callback)
  479. {
  480. MenuItem::initWithCallback(callback);
  481. setNormalImage(normalSprite);
  482. setSelectedImage(selectedSprite);
  483. setDisabledImage(disabledSprite);
  484. if(_normalImage)
  485. {
  486. this->setContentSize(_normalImage->getContentSize());
  487. }
  488. setCascadeColorEnabled(true);
  489. setCascadeOpacityEnabled(true);
  490. return true;
  491. }
  492. /**
  493. @since v0.99.5
  494. */
  495. void MenuItemSprite::selected()
  496. {
  497. MenuItem::selected();
  498. if (_normalImage)
  499. {
  500. if (_disabledImage)
  501. {
  502. _disabledImage->setVisible(false);
  503. }
  504. if (_selectedImage)
  505. {
  506. _normalImage->setVisible(false);
  507. _selectedImage->setVisible(true);
  508. }
  509. else
  510. {
  511. _normalImage->setVisible(true);
  512. }
  513. }
  514. }
  515. void MenuItemSprite::unselected()
  516. {
  517. MenuItem::unselected();
  518. this->updateImagesVisibility();
  519. }
  520. void MenuItemSprite::setEnabled(bool bEnabled)
  521. {
  522. if( _enabled != bEnabled )
  523. {
  524. MenuItem::setEnabled(bEnabled);
  525. this->updateImagesVisibility();
  526. }
  527. }
  528. // Helper
  529. void MenuItemSprite::updateImagesVisibility()
  530. {
  531. if (_enabled)
  532. {
  533. if (_normalImage) _normalImage->setVisible(true);
  534. if (_selectedImage) _selectedImage->setVisible(false);
  535. if (_disabledImage) _disabledImage->setVisible(false);
  536. }
  537. else
  538. {
  539. if (_disabledImage)
  540. {
  541. if (_normalImage) _normalImage->setVisible(false);
  542. if (_selectedImage) _selectedImage->setVisible(false);
  543. if (_disabledImage) _disabledImage->setVisible(true);
  544. }
  545. else
  546. {
  547. if (_normalImage) _normalImage->setVisible(true);
  548. if (_selectedImage) _selectedImage->setVisible(false);
  549. if (_disabledImage) _disabledImage->setVisible(false);
  550. }
  551. }
  552. }
  553. ///
  554. /// MenuItemImage
  555. ///
  556. MenuItemImage* MenuItemImage::create()
  557. {
  558. MenuItemImage *ret = new (std::nothrow) MenuItemImage();
  559. if (ret && ret->init())
  560. {
  561. ret->autorelease();
  562. return ret;
  563. }
  564. CC_SAFE_DELETE(ret);
  565. return nullptr;
  566. }
  567. bool MenuItemImage::init(void)
  568. {
  569. return initWithNormalImage("", "", "", (const ccMenuCallback&)nullptr);
  570. }
  571. MenuItemImage * MenuItemImage::create(const std::string& normalImage, const std::string& selectedImage)
  572. {
  573. return MenuItemImage::create(normalImage, selectedImage, "", (const ccMenuCallback&)nullptr);
  574. }
  575. // FIXME: deprecated
  576. MenuItemImage * MenuItemImage::create(const std::string& normalImage, const std::string& selectedImage, Ref* target, SEL_MenuHandler selector)
  577. {
  578. return MenuItemImage::create(normalImage, selectedImage, "", std::bind(selector, target, std::placeholders::_1));
  579. }
  580. MenuItemImage * MenuItemImage::create(const std::string& normalImage, const std::string& selectedImage, const ccMenuCallback& callback)
  581. {
  582. return MenuItemImage::create(normalImage, selectedImage, "", callback);
  583. }
  584. // FIXME: deprecated
  585. MenuItemImage * MenuItemImage::create(const std::string& normalImage, const std::string& selectedImage, const std::string& disabledImage, Ref* target, SEL_MenuHandler selector)
  586. {
  587. MenuItemImage *ret = new (std::nothrow) MenuItemImage();
  588. if (ret && ret->initWithNormalImage(normalImage, selectedImage, disabledImage, std::bind(selector, target, std::placeholders::_1)))
  589. {
  590. ret->autorelease();
  591. return ret;
  592. }
  593. CC_SAFE_DELETE(ret);
  594. return nullptr;
  595. }
  596. MenuItemImage * MenuItemImage::create(const std::string& normalImage, const std::string& selectedImage, const std::string& disabledImage, const ccMenuCallback& callback)
  597. {
  598. MenuItemImage *ret = new (std::nothrow) MenuItemImage();
  599. if (ret && ret->initWithNormalImage(normalImage, selectedImage, disabledImage, callback))
  600. {
  601. ret->autorelease();
  602. return ret;
  603. }
  604. CC_SAFE_DELETE(ret);
  605. return nullptr;
  606. }
  607. MenuItemImage * MenuItemImage::create(const std::string& normalImage, const std::string& selectedImage, const std::string& disabledImage)
  608. {
  609. MenuItemImage *ret = new (std::nothrow) MenuItemImage();
  610. if (ret && ret->initWithNormalImage(normalImage, selectedImage, disabledImage, (const ccMenuCallback&)nullptr))
  611. {
  612. ret->autorelease();
  613. return ret;
  614. }
  615. CC_SAFE_DELETE(ret);
  616. return nullptr;
  617. }
  618. // FIXME:: deprecated
  619. bool MenuItemImage::initWithNormalImage(const std::string& normalImage, const std::string& selectedImage, const std::string& disabledImage, Ref* target, SEL_MenuHandler selector)
  620. {
  621. return initWithNormalImage(normalImage, selectedImage, disabledImage, std::bind(selector,target, std::placeholders::_1) );
  622. }
  623. bool MenuItemImage::initWithNormalImage(const std::string& normalImage, const std::string& selectedImage, const std::string& disabledImage, const ccMenuCallback& callback)
  624. {
  625. Node *normalSprite = nullptr;
  626. Node *selectedSprite = nullptr;
  627. Node *disabledSprite = nullptr;
  628. if (normalImage.size() >0)
  629. {
  630. normalSprite = Sprite::create(normalImage);
  631. }
  632. if (selectedImage.size() >0)
  633. {
  634. selectedSprite = Sprite::create(selectedImage);
  635. }
  636. if(disabledImage.size() >0)
  637. {
  638. disabledSprite = Sprite::create(disabledImage);
  639. }
  640. return initWithNormalSprite(normalSprite, selectedSprite, disabledSprite, callback);
  641. }
  642. //
  643. // Setter of sprite frames
  644. //
  645. void MenuItemImage::setNormalSpriteFrame(SpriteFrame * frame)
  646. {
  647. setNormalImage(Sprite::createWithSpriteFrame(frame));
  648. }
  649. void MenuItemImage::setSelectedSpriteFrame(SpriteFrame * frame)
  650. {
  651. setSelectedImage(Sprite::createWithSpriteFrame(frame));
  652. }
  653. void MenuItemImage::setDisabledSpriteFrame(SpriteFrame * frame)
  654. {
  655. setDisabledImage(Sprite::createWithSpriteFrame(frame));
  656. }
  657. //
  658. // MenuItemToggle
  659. //
  660. // FIXME:: deprecated
  661. MenuItemToggle * MenuItemToggle::createWithTarget(Ref* target, SEL_MenuHandler selector, const Vector<MenuItem*>& menuItems)
  662. {
  663. MenuItemToggle *ret = new (std::nothrow) MenuItemToggle();
  664. ret->MenuItem::initWithCallback(std::bind(selector, target, std::placeholders::_1));
  665. ret->autorelease();
  666. #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  667. auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
  668. if (sEngine)
  669. {
  670. for (const auto &item : menuItems)
  671. {
  672. if (item)
  673. {
  674. sEngine->retainScriptObject(ret, item);
  675. }
  676. }
  677. }
  678. #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  679. ret->_subItems = menuItems;
  680. ret->_selectedIndex = UINT_MAX;
  681. ret->setSelectedIndex(0);
  682. return ret;
  683. }
  684. MenuItemToggle * MenuItemToggle::createWithCallback(const ccMenuCallback &callback, const Vector<MenuItem*>& menuItems)
  685. {
  686. MenuItemToggle *ret = new (std::nothrow) MenuItemToggle();
  687. ret->MenuItem::initWithCallback(callback);
  688. ret->autorelease();
  689. #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  690. auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
  691. if (sEngine)
  692. {
  693. for (const auto &item : menuItems)
  694. {
  695. if (item)
  696. {
  697. sEngine->retainScriptObject(ret, item);
  698. }
  699. }
  700. }
  701. #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  702. ret->_subItems = menuItems;
  703. ret->_selectedIndex = UINT_MAX;
  704. ret->setSelectedIndex(0);
  705. return ret;
  706. }
  707. // FIXME:: deprecated
  708. MenuItemToggle * MenuItemToggle::createWithTarget(Ref* target, SEL_MenuHandler selector, MenuItem* item, ...)
  709. {
  710. va_list args;
  711. va_start(args, item);
  712. MenuItemToggle *ret = new (std::nothrow) MenuItemToggle();
  713. ret->initWithCallback(std::bind(selector, target, std::placeholders::_1), item, args);
  714. ret->autorelease();
  715. va_end(args);
  716. return ret;
  717. }
  718. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
  719. MenuItemToggle * MenuItemToggle::createWithCallbackVA(const ccMenuCallback &callback, MenuItem* item, ...)
  720. {
  721. va_list args;
  722. va_start(args, item);
  723. MenuItemToggle *ret = new (std::nothrow) MenuItemToggle();
  724. ret->initWithCallback(callback, item, args);
  725. ret->autorelease();
  726. va_end(args);
  727. return ret;
  728. }
  729. #else
  730. MenuItemToggle * MenuItemToggle::createWithCallback(const ccMenuCallback &callback, MenuItem* item, ...)
  731. {
  732. va_list args;
  733. va_start(args, item);
  734. MenuItemToggle *ret = new (std::nothrow) MenuItemToggle();
  735. ret->initWithCallback(callback, item, args);
  736. ret->autorelease();
  737. va_end(args);
  738. return ret;
  739. }
  740. #endif
  741. MenuItemToggle * MenuItemToggle::create()
  742. {
  743. MenuItemToggle *ret = new (std::nothrow) MenuItemToggle();
  744. ret->initWithItem(nullptr);
  745. ret->autorelease();
  746. return ret;
  747. }
  748. // FIXME:: deprecated
  749. bool MenuItemToggle::initWithTarget(Ref* target, SEL_MenuHandler selector, MenuItem* item, va_list args)
  750. {
  751. return initWithCallback(std::bind( selector, target, std::placeholders::_1), item, args);
  752. }
  753. bool MenuItemToggle::initWithCallback(const ccMenuCallback &callback, MenuItem *item, va_list args)
  754. {
  755. MenuItem::initWithCallback(callback);
  756. int z = 0;
  757. MenuItem *i = item;
  758. #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  759. auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
  760. #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  761. while(i)
  762. {
  763. z++;
  764. #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  765. if (sEngine)
  766. {
  767. sEngine->retainScriptObject(this, i);
  768. }
  769. #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  770. _subItems.pushBack(i);
  771. i = va_arg(args, MenuItem*);
  772. }
  773. _selectedIndex = UINT_MAX;
  774. this->setSelectedIndex(0);
  775. return true;
  776. }
  777. MenuItemToggle* MenuItemToggle::create(MenuItem *item)
  778. {
  779. MenuItemToggle *ret = new (std::nothrow) MenuItemToggle();
  780. ret->initWithItem(item);
  781. ret->autorelease();
  782. return ret;
  783. }
  784. bool MenuItemToggle::initWithItem(MenuItem *item)
  785. {
  786. MenuItem::initWithCallback((const ccMenuCallback&)nullptr);
  787. if (item)
  788. {
  789. addSubItem(item);
  790. }
  791. _selectedIndex = UINT_MAX;
  792. this->setSelectedIndex(0);
  793. setCascadeColorEnabled(true);
  794. setCascadeOpacityEnabled(true);
  795. return true;
  796. }
  797. void MenuItemToggle::addSubItem(MenuItem *item)
  798. {
  799. #if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  800. auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
  801. if (sEngine)
  802. {
  803. sEngine->retainScriptObject(this, item);
  804. }
  805. #endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
  806. _subItems.pushBack(item);
  807. }
  808. void MenuItemToggle::cleanup()
  809. {
  810. for(const auto &item : _subItems) {
  811. #if defined(CC_NATIVE_CONTROL_SCRIPT) && !CC_NATIVE_CONTROL_SCRIPT
  812. ScriptEngineManager::getInstance()->getScriptEngine()->releaseScriptObject(this, item);
  813. #endif
  814. item->cleanup();
  815. }
  816. MenuItem::cleanup();
  817. }
  818. void MenuItemToggle::setSelectedIndex(unsigned int index)
  819. {
  820. if( index != _selectedIndex && _subItems.size() > 0 )
  821. {
  822. _selectedIndex = index;
  823. if (_selectedItem)
  824. {
  825. _selectedItem->removeFromParentAndCleanup(false);
  826. }
  827. _selectedItem = _subItems.at(_selectedIndex);
  828. this->addChild(_selectedItem);
  829. Size s = _selectedItem->getContentSize();
  830. this->setContentSize(s);
  831. _selectedItem->setPosition(s.width / 2, s.height / 2);
  832. }
  833. }
  834. void MenuItemToggle::selected()
  835. {
  836. MenuItem::selected();
  837. _subItems.at(_selectedIndex)->selected();
  838. }
  839. void MenuItemToggle::unselected()
  840. {
  841. MenuItem::unselected();
  842. _subItems.at(_selectedIndex)->unselected();
  843. }
  844. void MenuItemToggle::activate()
  845. {
  846. // update index
  847. if( _enabled )
  848. {
  849. unsigned int newIndex = (_selectedIndex + 1) % _subItems.size();
  850. this->setSelectedIndex(newIndex);
  851. }
  852. MenuItem::activate();
  853. }
  854. void MenuItemToggle::setEnabled(bool enabled)
  855. {
  856. if (_enabled != enabled)
  857. {
  858. MenuItem::setEnabled(enabled);
  859. for(const auto &item : _subItems) {
  860. item->setEnabled(enabled);
  861. }
  862. }
  863. }
  864. MenuItem* MenuItemToggle::getSelectedItem()
  865. {
  866. return _subItems.at(_selectedIndex);
  867. }
  868. NS_CC_END