Files
2026-08-16 18:24:52 +07:00

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