/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 7 End-User License Agreement and JUCE Privacy Policy. End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ namespace juce { ToolbarItemFactory::ToolbarItemFactory() {} ToolbarItemFactory::~ToolbarItemFactory() {} //============================================================================== ToolbarItemComponent::ToolbarItemComponent (const int itemId_, const String& labelText, const bool isBeingUsedAsAButton_) : Button (labelText), itemId (itemId_), mode (normalMode), toolbarStyle (Toolbar::iconsOnly), dragOffsetX (0), dragOffsetY (0), isActive (true), isBeingDragged (false), isBeingUsedAsAButton (isBeingUsedAsAButton_) { // Your item ID can't be 0! jassert (itemId_ != 0); } ToolbarItemComponent::~ToolbarItemComponent() { overlayComp.reset(); } Toolbar* ToolbarItemComponent::getToolbar() const { return dynamic_cast (getParentComponent()); } bool ToolbarItemComponent::isToolbarVertical() const { const Toolbar* const t = getToolbar(); return t != nullptr && t->isVertical(); } void ToolbarItemComponent::setStyle (const Toolbar::ToolbarItemStyle& newStyle) { if (toolbarStyle != newStyle) { toolbarStyle = newStyle; repaint(); resized(); } } void ToolbarItemComponent::paintButton (Graphics& g, const bool over, const bool down) { if (isBeingUsedAsAButton) getLookAndFeel().paintToolbarButtonBackground (g, getWidth(), getHeight(), over, down, *this); if (toolbarStyle != Toolbar::iconsOnly) { auto indent = contentArea.getX(); auto y = indent; auto h = getHeight() - indent * 2; if (toolbarStyle == Toolbar::iconsWithText) { y = contentArea.getBottom() + indent / 2; h -= contentArea.getHeight(); } getLookAndFeel().paintToolbarButtonLabel (g, indent, y, getWidth() - indent * 2, h, getButtonText(), *this); } if (! contentArea.isEmpty()) { Graphics::ScopedSaveState ss (g); g.reduceClipRegion (contentArea); g.setOrigin (contentArea.getPosition()); paintButtonArea (g, contentArea.getWidth(), contentArea.getHeight(), over, down); } } void ToolbarItemComponent::resized() { if (toolbarStyle != Toolbar::textOnly) { const int indent = jmin (proportionOfWidth (0.08f), proportionOfHeight (0.08f)); contentArea = Rectangle (indent, indent, getWidth() - indent * 2, toolbarStyle == Toolbar::iconsWithText ? proportionOfHeight (0.55f) : (getHeight() - indent * 2)); } else { contentArea = {}; } contentAreaChanged (contentArea); } void ToolbarItemComponent::setEditingMode (const ToolbarEditingMode newMode) { if (mode != newMode) { mode = newMode; repaint(); if (mode == normalMode) { overlayComp.reset(); } else if (overlayComp == nullptr) { overlayComp.reset (new detail::ToolbarItemDragAndDropOverlayComponent()); addAndMakeVisible (overlayComp.get()); overlayComp->parentSizeChanged(); } resized(); } } //============================================================================== std::unique_ptr ToolbarItemComponent::createAccessibilityHandler() { const auto shouldItemBeAccessible = (itemId != ToolbarItemFactory::separatorBarId && itemId != ToolbarItemFactory::spacerId && itemId != ToolbarItemFactory::flexibleSpacerId); if (! shouldItemBeAccessible) return createIgnoredAccessibilityHandler (*this); return std::make_unique (*this, AccessibilityRole::button); } } // namespace juce