123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- /*
- ==============================================================================
- This file is part of the JUCE library.
- Copyright (c) 2013 - Raw Material Software Ltd.
- Permission is granted to use this software under the terms of either:
- a) the GPL v2 (or any later version)
- b) the Affero GPL v3
- Details of these licenses can be found at: www.gnu.org/licenses
- JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- ------------------------------------------------------------------------------
- To release a closed-source product which uses JUCE, commercial licenses are
- available: visit www.juce.com for more information.
- ==============================================================================
- */
- ImageButton::ImageButton (const String& text_)
- : Button (text_),
- scaleImageToFit (true),
- preserveProportions (true),
- alphaThreshold (0)
- {
- }
- ImageButton::~ImageButton()
- {
- }
- void ImageButton::setImages (const bool resizeButtonNowToFitThisImage,
- const bool rescaleImagesWhenButtonSizeChanges,
- const bool preserveImageProportions,
- const Image& normalImage_,
- const float imageOpacityWhenNormal,
- Colour overlayColourWhenNormal,
- const Image& overImage_,
- const float imageOpacityWhenOver,
- Colour overlayColourWhenOver,
- const Image& downImage_,
- const float imageOpacityWhenDown,
- Colour overlayColourWhenDown,
- const float hitTestAlphaThreshold)
- {
- normalImage = normalImage_;
- overImage = overImage_;
- downImage = downImage_;
- if (resizeButtonNowToFitThisImage && normalImage.isValid())
- {
- imageBounds.setSize (normalImage.getWidth(),
- normalImage.getHeight());
- setSize (imageBounds.getWidth(), imageBounds.getHeight());
- }
- scaleImageToFit = rescaleImagesWhenButtonSizeChanges;
- preserveProportions = preserveImageProportions;
- normalOpacity = imageOpacityWhenNormal;
- normalOverlay = overlayColourWhenNormal;
- overOpacity = imageOpacityWhenOver;
- overOverlay = overlayColourWhenOver;
- downOpacity = imageOpacityWhenDown;
- downOverlay = overlayColourWhenDown;
- alphaThreshold = (uint8) jlimit (0, 0xff, roundToInt (255.0f * hitTestAlphaThreshold));
- repaint();
- }
- Image ImageButton::getCurrentImage() const
- {
- if (isDown() || getToggleState())
- return getDownImage();
- if (isOver())
- return getOverImage();
- return getNormalImage();
- }
- Image ImageButton::getNormalImage() const
- {
- return normalImage;
- }
- Image ImageButton::getOverImage() const
- {
- return overImage.isValid() ? overImage
- : normalImage;
- }
- Image ImageButton::getDownImage() const
- {
- return downImage.isValid() ? downImage
- : getOverImage();
- }
- void ImageButton::paintButton (Graphics& g,
- bool isMouseOverButton,
- bool isButtonDown)
- {
- if (! isEnabled())
- {
- isMouseOverButton = false;
- isButtonDown = false;
- }
- Image im (getCurrentImage());
- if (im.isValid())
- {
- const int iw = im.getWidth();
- const int ih = im.getHeight();
- int w = getWidth();
- int h = getHeight();
- int x = (w - iw) / 2;
- int y = (h - ih) / 2;
- if (scaleImageToFit)
- {
- if (preserveProportions)
- {
- int newW, newH;
- const float imRatio = ih / (float) iw;
- const float destRatio = h / (float) w;
- if (imRatio > destRatio)
- {
- newW = roundToInt (h / imRatio);
- newH = h;
- }
- else
- {
- newW = w;
- newH = roundToInt (w * imRatio);
- }
- x = (w - newW) / 2;
- y = (h - newH) / 2;
- w = newW;
- h = newH;
- }
- else
- {
- x = 0;
- y = 0;
- }
- }
- if (! scaleImageToFit)
- {
- w = iw;
- h = ih;
- }
- imageBounds.setBounds (x, y, w, h);
- const bool useDownImage = isButtonDown || getToggleState();
- getLookAndFeel().drawImageButton (g, &im, x, y, w, h,
- useDownImage ? downOverlay
- : (isMouseOverButton ? overOverlay
- : normalOverlay),
- useDownImage ? downOpacity
- : (isMouseOverButton ? overOpacity
- : normalOpacity),
- *this);
- }
- }
- bool ImageButton::hitTest (int x, int y)
- {
- if (alphaThreshold == 0)
- return true;
- Image im (getCurrentImage());
- return im.isNull() || ((! imageBounds.isEmpty())
- && alphaThreshold < im.getPixelAt (((x - imageBounds.getX()) * im.getWidth()) / imageBounds.getWidth(),
- ((y - imageBounds.getY()) * im.getHeight()) / imageBounds.getHeight()).getAlpha());
- }
|