void MyControlButton::setBlendFunc(){ BlendFunc blend = {GL_SRC_ALPHA , GL_ONE}; _bgSprite = ui::Scale9Sprite::createWithSpriteFrame(getBackgroundSprite()->getSprite()->getSpriteFrame()); for (Node * child : _bgSprite->_protectedChildren) { ((Sprite*)child)->setBlendFunc(blend); } setBackgroundSpriteForState(_bgSprite, Control::State::HIGH_LIGHTED); }
virtual void needsLayout(void) { if (!_parentInited) { return; } // Hide the background and the label if (getTitleLabel() != nullptr) { getTitleLabel()->setVisible(false); } if (getBackgroundSprite()) { getBackgroundSprite()->setVisible(false); } // Update anchor of all labels this->setLabelAnchorPoint(this->_labelAnchorPoint); // Update the label to match with the current state _currentTitle = getTitleForState(_state); _currentTitleColor = getTitleColorForState(_state); this->setTitleLabel(getTitleLabelForState(_state)); LabelProtocol* label = dynamic_cast<LabelProtocol*>(getTitleLabel()); if (label && !_currentTitle.empty()) { label->setString(_currentTitle); } if (getTitleLabel()) { getTitleLabel()->setColor(_currentTitleColor); } if (getTitleLabel() != nullptr) { getTitleLabel()->setPosition(Point (getContentSize().width / 2, getContentSize().height / 2)); } // Update the background sprite this->setBackgroundSprite(this->getBackgroundSpriteForState(_state)); if (getBackgroundSprite() != nullptr) { getBackgroundSprite()->setPosition(Point (getContentSize().width / 2, getContentSize().height / 2)); } // Get the title label size Size titleLabelSize; if (getTitleLabel() != nullptr) { titleLabelSize = getTitleLabel()->getBoundingBox().size; } // Adjust the background image if necessary if (_doesAdjustBackgroundImage) { // Add the margins if (getBackgroundSprite() != nullptr) { getBackgroundSprite()->setContentSize(Size(titleLabelSize.width + _marginH * 2, titleLabelSize.height + _marginV * 2)); } } else { //TODO: should this also have margins if one of the preferred sizes is relaxed? if (getBackgroundSprite() != nullptr) { Size preferredSize = getBackgroundSprite()->getPreferredSize(); if (preferredSize.width <= 0) { preferredSize.width = titleLabelSize.width; } if (preferredSize.height <= 0) { preferredSize.height = titleLabelSize.height; } getBackgroundSprite()->setContentSize(preferredSize); } } // Set the content size Rect rectTitle; if (getTitleLabel() != nullptr) { rectTitle = getTitleLabel()->getBoundingBox(); } Rect rectBackground; if (getBackgroundSprite() != nullptr) { rectBackground = getBackgroundSprite()->getBoundingBox(); } Rect maxRect = ControlUtils::RectUnion(rectTitle, rectBackground); if (_maxSize.width > 0 && maxRect.size.width > _maxSize.width) maxRect.size.width = _maxSize.width; if (_maxSize.height > 0 && maxRect.size.height > _maxSize.height) maxRect.size.height = _maxSize.height; if (titleLabelSize.width > maxRect.size.width - _horizonPadding * 2) maxRect.size.width += _horizonPadding * 2; if (titleLabelSize.height > maxRect.size.height - _verticalPadding * 2) maxRect.size.height += _verticalPadding * 2; setContentSize(Size(maxRect.size.width, maxRect.size.height)); if (getTitleLabel() != nullptr) { getTitleLabel()->setPosition(Point(getContentSize().width/2, getContentSize().height/2)); // Make visible the background and the label getTitleLabel()->setVisible(true); } if (getBackgroundSprite() != nullptr) { getBackgroundSprite()->setPosition(Point(getContentSize().width/2, getContentSize().height/2)); getBackgroundSprite()->setVisible(true); getBackgroundSprite()->setContentSize(maxRect.size); } }