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.

112 lines
3.3KB

  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. HyperlinkButton::HyperlinkButton (const String& linkText,
  20. const URL& linkURL)
  21. : Button (linkText),
  22. url (linkURL),
  23. font (14.0f, Font::underlined),
  24. resizeFont (true),
  25. justification (Justification::centred)
  26. {
  27. setMouseCursor (MouseCursor::PointingHandCursor);
  28. setTooltip (linkURL.toString (false));
  29. }
  30. HyperlinkButton::HyperlinkButton()
  31. : Button (String()),
  32. font (14.0f, Font::underlined),
  33. resizeFont (true),
  34. justification (Justification::centred)
  35. {
  36. setMouseCursor (MouseCursor::PointingHandCursor);
  37. }
  38. HyperlinkButton::~HyperlinkButton()
  39. {
  40. }
  41. //==============================================================================
  42. void HyperlinkButton::setFont (const Font& newFont,
  43. const bool resizeToMatchComponentHeight,
  44. Justification justificationType)
  45. {
  46. font = newFont;
  47. resizeFont = resizeToMatchComponentHeight;
  48. justification = justificationType;
  49. repaint();
  50. }
  51. void HyperlinkButton::setURL (const URL& newURL) noexcept
  52. {
  53. url = newURL;
  54. setTooltip (newURL.toString (false));
  55. }
  56. Font HyperlinkButton::getFontToUse() const
  57. {
  58. if (resizeFont)
  59. return font.withHeight (getHeight() * 0.7f);
  60. return font;
  61. }
  62. void HyperlinkButton::changeWidthToFitText()
  63. {
  64. setSize (getFontToUse().getStringWidth (getButtonText()) + 6, getHeight());
  65. }
  66. void HyperlinkButton::colourChanged()
  67. {
  68. repaint();
  69. }
  70. //==============================================================================
  71. void HyperlinkButton::clicked()
  72. {
  73. if (url.isWellFormed())
  74. url.launchInDefaultBrowser();
  75. }
  76. void HyperlinkButton::paintButton (Graphics& g,
  77. bool isMouseOverButton,
  78. bool isButtonDown)
  79. {
  80. const Colour textColour (findColour (textColourId));
  81. if (isEnabled())
  82. g.setColour ((isMouseOverButton) ? textColour.darker ((isButtonDown) ? 1.3f : 0.4f)
  83. : textColour);
  84. else
  85. g.setColour (textColour.withMultipliedAlpha (0.4f));
  86. g.setFont (getFontToUse());
  87. g.drawText (getButtonText(), getLocalBounds().reduced (1, 0),
  88. justification.getOnlyHorizontalFlags() | Justification::verticallyCentred,
  89. true);
  90. }