190 lines
5.0 KiB
C++
190 lines
5.0 KiB
C++
// This file is part of VSTGUI. It is subject to the license terms
|
|
// in the LICENSE file found in the top-level directory of this
|
|
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
|
|
|
|
#include "cmoviebutton.h"
|
|
#include "../cdrawcontext.h"
|
|
#include "../cbitmap.h"
|
|
#include "../events.h"
|
|
|
|
namespace VSTGUI {
|
|
|
|
//------------------------------------------------------------------------
|
|
// CMovieButton
|
|
//------------------------------------------------------------------------
|
|
/**
|
|
* CMovieButton constructor.
|
|
* @param size the size of this view
|
|
* @param listener the listener
|
|
* @param tag the control tag
|
|
* @param background bitmap
|
|
*/
|
|
//------------------------------------------------------------------------
|
|
CMovieButton::CMovieButton (const CRect& size, IControlListener* listener, int32_t tag,
|
|
CBitmap* background)
|
|
: CControl (size, listener, tag, background), buttonState (value)
|
|
{
|
|
#if VSTGUI_ENABLE_DEPRECATED_METHODS
|
|
heightOfOneImage = size.getHeight ();
|
|
#endif
|
|
setWantsFocus (true);
|
|
}
|
|
|
|
#if VSTGUI_ENABLE_DEPRECATED_METHODS
|
|
//------------------------------------------------------------------------
|
|
/**
|
|
* CMovieButton constructor.
|
|
* @param size the size of this view
|
|
* @param listener the listener
|
|
* @param tag the control tag
|
|
* @param heightOfOneImage height of one image in pixel
|
|
* @param background bitmap
|
|
* @param offset
|
|
*/
|
|
//------------------------------------------------------------------------
|
|
CMovieButton::CMovieButton (const CRect& size, IControlListener* listener, int32_t tag, CCoord heightOfOneImage, CBitmap* background, const CPoint &offset)
|
|
: CControl (size, listener, tag, background)
|
|
, offset (offset)
|
|
, buttonState (value)
|
|
{
|
|
setHeightOfOneImage (heightOfOneImage);
|
|
setWantsFocus (true);
|
|
}
|
|
#endif
|
|
|
|
//------------------------------------------------------------------------
|
|
CMovieButton::CMovieButton (const CMovieButton& v) : CControl (v), buttonState (v.buttonState)
|
|
{
|
|
#if VSTGUI_ENABLE_DEPRECATED_METHODS
|
|
offset = v.offset;
|
|
setHeightOfOneImage (v.heightOfOneImage);
|
|
#endif
|
|
setWantsFocus (true);
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
void CMovieButton::draw (CDrawContext *pContext)
|
|
{
|
|
if (auto bitmap = getDrawBackground ())
|
|
{
|
|
if (auto mfb = dynamic_cast<CMultiFrameBitmap*> (bitmap))
|
|
{
|
|
auto frameIndex = getMultiFrameBitmapIndex (*mfb, getValueNormalized ());
|
|
mfb->drawFrame (pContext, frameIndex, getViewSize ().getTopLeft ());
|
|
}
|
|
else
|
|
{
|
|
CPoint where {};
|
|
#if VSTGUI_ENABLE_DEPRECATED_METHODS
|
|
if (value == getMax ())
|
|
where.y = heightOfOneImage;
|
|
#endif
|
|
bitmap->draw (pContext, getViewSize (), where);
|
|
}
|
|
}
|
|
buttonState = value;
|
|
|
|
setDirty (false);
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
CMouseEventResult CMovieButton::onMouseDown (CPoint& where, const CButtonState& buttons)
|
|
{
|
|
if (!(buttons & kLButton))
|
|
return kMouseEventNotHandled;
|
|
fEntryState = value;
|
|
beginEdit ();
|
|
return onMouseMoved (where, buttons);
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
CMouseEventResult CMovieButton::onMouseUp (CPoint& where, const CButtonState& buttons)
|
|
{
|
|
if (isEditing ())
|
|
endEdit ();
|
|
return kMouseEventHandled;
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
CMouseEventResult CMovieButton::onMouseMoved (CPoint& where, const CButtonState& buttons)
|
|
{
|
|
if (isEditing ())
|
|
{
|
|
if (where.x >= getViewSize ().left &&
|
|
where.y >= getViewSize ().top &&
|
|
where.x <= getViewSize ().right &&
|
|
where.y <= getViewSize ().bottom)
|
|
value = (fEntryState == getMax ()) ? getMin () : getMax ();
|
|
else
|
|
value = fEntryState;
|
|
|
|
if (isDirty ())
|
|
{
|
|
valueChanged ();
|
|
invalid ();
|
|
}
|
|
return kMouseEventHandled;
|
|
}
|
|
return kMouseEventNotHandled;
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
CMouseEventResult CMovieButton::onMouseCancel ()
|
|
{
|
|
if (isEditing ())
|
|
{
|
|
value = fEntryState;
|
|
if (isDirty ())
|
|
{
|
|
valueChanged ();
|
|
invalid ();
|
|
}
|
|
endEdit ();
|
|
}
|
|
return kMouseEventHandled;
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
void CMovieButton::onKeyboardEvent (KeyboardEvent& event)
|
|
{
|
|
if (event.type != EventType::KeyDown || event.modifiers.empty () == false)
|
|
return;
|
|
if (event.virt == VirtualKey::Return)
|
|
{
|
|
value = (value == getMax ()) ? getMin () : getMax ();
|
|
invalid ();
|
|
beginEdit ();
|
|
valueChanged ();
|
|
endEdit ();
|
|
event.consumed = true;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------
|
|
bool CMovieButton::sizeToFit ()
|
|
{
|
|
if (auto bitmap = getDrawBackground ())
|
|
{
|
|
CRect vs (getViewSize ());
|
|
if (auto mfb = dynamic_cast<CMultiFrameBitmap*> (bitmap))
|
|
{
|
|
vs.setSize (mfb->getFrameSize ());
|
|
}
|
|
else
|
|
{
|
|
vs.setWidth (bitmap->getWidth ());
|
|
#if VSTGUI_ENABLE_DEPRECATED_METHODS
|
|
vs.setHeight (getHeightOfOneImage ());
|
|
#else
|
|
vs.setHeight (bitmap->getHeight ());
|
|
#endif
|
|
}
|
|
setViewSize (vs);
|
|
setMouseableArea (vs);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
} // VSTGUI
|