The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.0KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2017 - ROLI Ltd.
  5. JUCE is an open source library subject to commercial or open-source
  6. licensing.
  7. By using JUCE, you agree to the terms of both the JUCE 5 End-User License
  8. Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
  9. 27th April 2017).
  10. End User License Agreement: www.juce.com/juce-5-licence
  11. Privacy Policy: www.juce.com/juce-5-privacy-policy
  12. Or: You may also use this code under the terms of the GPL v3 (see
  13. www.gnu.org/licenses).
  14. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
  15. EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
  16. DISCLAIMED.
  17. ==============================================================================
  18. */
  19. ToolbarButton::ToolbarButton (const int iid, const String& buttonText,
  20. Drawable* const normalIm, Drawable* const toggledOnIm)
  21. : ToolbarItemComponent (iid, buttonText, true),
  22. normalImage (normalIm),
  23. toggledOnImage (toggledOnIm),
  24. currentImage (nullptr)
  25. {
  26. jassert (normalImage != nullptr);
  27. }
  28. ToolbarButton::~ToolbarButton()
  29. {
  30. }
  31. //==============================================================================
  32. bool ToolbarButton::getToolbarItemSizes (int toolbarDepth, bool /*isToolbarVertical*/, int& preferredSize, int& minSize, int& maxSize)
  33. {
  34. preferredSize = minSize = maxSize = toolbarDepth;
  35. return true;
  36. }
  37. void ToolbarButton::paintButtonArea (Graphics&, int /*width*/, int /*height*/, bool /*isMouseOver*/, bool /*isMouseDown*/)
  38. {
  39. }
  40. void ToolbarButton::contentAreaChanged (const Rectangle<int>&)
  41. {
  42. buttonStateChanged();
  43. }
  44. void ToolbarButton::setCurrentImage (Drawable* const newImage)
  45. {
  46. if (newImage != currentImage)
  47. {
  48. removeChildComponent (currentImage);
  49. currentImage = newImage;
  50. if (currentImage != nullptr)
  51. {
  52. enablementChanged();
  53. addAndMakeVisible (currentImage);
  54. updateDrawable();
  55. }
  56. }
  57. }
  58. void ToolbarButton::updateDrawable()
  59. {
  60. if (currentImage != nullptr)
  61. {
  62. currentImage->setInterceptsMouseClicks (false, false);
  63. currentImage->setTransformToFit (getContentArea().toFloat(), RectanglePlacement::centred);
  64. currentImage->setAlpha (isEnabled() ? 1.0f : 0.5f);
  65. }
  66. }
  67. void ToolbarButton::resized()
  68. {
  69. ToolbarItemComponent::resized();
  70. updateDrawable();
  71. }
  72. void ToolbarButton::enablementChanged()
  73. {
  74. ToolbarItemComponent::enablementChanged();
  75. updateDrawable();
  76. }
  77. Drawable* ToolbarButton::getImageToUse() const
  78. {
  79. if (getStyle() == Toolbar::textOnly)
  80. return nullptr;
  81. if (getToggleState() && toggledOnImage != nullptr)
  82. return toggledOnImage;
  83. return normalImage;
  84. }
  85. void ToolbarButton::buttonStateChanged()
  86. {
  87. setCurrentImage (getImageToUse());
  88. }