#include "toolbar.hpp" #include Toolbar::Toolbar(): toolbarTopTexture(nullptr), toolbarBottomTexture(nullptr), toolbarMiddleTexture(nullptr), buttonRaisedTexture(nullptr), buttonDepressedTexture(nullptr), depressedButtonIndex(0) { toolbarContainer.addChild(&toolbarTopImage); toolbarContainer.addChild(&toolbarBottomImage); toolbarContainer.addChild(&toolbarMiddleImage); } void Toolbar::setToolbarTopTexture(Texture* texture) { toolbarTopTexture = texture; toolbarTopImage.setTexture(toolbarTopTexture); } void Toolbar::setToolbarBottomTexture(Texture* texture) { toolbarBottomTexture = texture; toolbarBottomImage.setTexture(toolbarBottomTexture); } void Toolbar::setToolbarMiddleTexture(Texture* texture) { toolbarMiddleTexture = texture; toolbarMiddleImage.setTexture(toolbarMiddleTexture); } void Toolbar::setButtonRaisedTexture(Texture* texture) { buttonRaisedTexture = texture; } void Toolbar::setButtonDepressedTexture(Texture* texture) { buttonDepressedTexture = texture; } void Toolbar::resize() { int toolbarWidth = toolbarMiddleTexture->getWidth(); int toolbarHeight = toolbarTopTexture->getHeight() + toolbarBottomTexture->getHeight() + toolbarMiddleTexture->getHeight() * std::max(0, (int)buttons.size() - 1); float borderSpacing = 8.0f; float buttonOffsetY = ((toolbarTopTexture->getHeight() + toolbarBottomTexture->getHeight()) - buttonRaisedTexture->getHeight()) / 2; // Resize toolbar toolbarContainer.setAnchor(Vector2(0.0f, 0.5f)); toolbarContainer.setDimensions(Vector2(toolbarWidth, toolbarHeight)); toolbarContainer.setTranslation(Vector2(borderSpacing, 0.0f)); toolbarTopImage.setAnchor(Vector2(0.0f, 0.0f)); toolbarTopImage.setDimensions(Vector2(toolbarTopTexture->getWidth(), toolbarTopTexture->getHeight())); toolbarTopImage.setTranslation(Vector2(0.0f, 0.0f)); toolbarBottomImage.setAnchor(Vector2(0.0f, 1.0f)); toolbarBottomImage.setDimensions(Vector2(toolbarBottomTexture->getWidth(), toolbarBottomTexture->getHeight())); toolbarBottomImage.setTranslation(Vector2(0.0f, 0.0f)); toolbarMiddleImage.setAnchor(Vector2(0.0f, 0.5f)); toolbarMiddleImage.setDimensions(Vector2(toolbarMiddleTexture->getWidth(), toolbarMiddleTexture->getHeight() * std::max(0, (int)buttons.size() - 1))); toolbarMiddleImage.setTranslation(Vector2(0.0f, 0.0f)); // Resize buttons and icons for (std::size_t i = 0; i < buttons.size(); ++i) { UIImage* button = buttons[i]; button->setAnchor(Vector2(0.5f, 0.0f)); button->setDimensions(Vector2(buttonRaisedTexture->getWidth(), buttonRaisedTexture->getHeight())); button->setTranslation(Vector2(0.0f, buttonOffsetY + i * toolbarMiddleTexture->getHeight())); UIImage* icon = icons[i]; icon->setAnchor(Vector2(0.5f, 0.5f)); icon->setDimensions(Vector2(icon->getTexture()->getWidth(), icon->getTexture()->getHeight())); icon->setTranslation(Vector2(0.0f, 0.0f)); } } void Toolbar::addButton(Texture* iconTexture, std::function pressCallback, std::function releaseCallback) { if (depressedButtonIndex == buttons.size()) { ++depressedButtonIndex; } // Allocate new button and icon UIImage* button = new UIImage(); button->setTexture(buttonRaisedTexture); buttons.push_back(button); UIImage* icon = new UIImage(); icon->setTexture(iconTexture); icon->setTintColor(Vector4(1.0f, 1.0f, 1.0f, 0.30f)); icons.push_back(icon); // Add button to toolbar toolbarContainer.addChild(button); // Add icon to button button->addChild(icon); // Setup callbacks std::size_t buttonIndex = buttons.size() - 1; //button->setMouseOverCallback(std::bind(&Toolbar::selectMenuItem, this, buttonIndex)); //button->setMouseMovedCallback(std::bind(&Toolbar::selectMenuItem, this, buttonIndex)); button->setMousePressedCallback(std::bind(&Toolbar::pressButton, this, buttonIndex)); pressCallbacks.push_back(pressCallback); releaseCallbacks.push_back(releaseCallback); } void Toolbar::pressButton(std::size_t index) { releaseButton(depressedButtonIndex); if (index == depressedButtonIndex) { depressedButtonIndex = buttons.size(); } else { depressedButtonIndex = index; buttons[index]->setTexture(buttonDepressedTexture); //icons[index]->setTranslation(Vector2(2.0f, 2.0f)); icons[index]->setTintColor(Vector4(1.0f, 1.0f, 1.0f, 1.0f)); pressCallbacks[index](); } } void Toolbar::releaseButton(std::size_t index) { if (index < buttons.size()) { buttons[index]->setTexture(buttonRaisedTexture); //icons[index]->setTranslation(Vector2(0.0f, 0.0f)); icons[index]->setTintColor(Vector4(1.0f, 1.0f, 1.0f, 0.30f)); releaseCallbacks[index](); } }