199 lines
5.2 KiB
C++
199 lines
5.2 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 "evbutton.h"
|
|
#include "externalview_hwnd.h"
|
|
#include "vstgui/lib/platform/win32/win32factory.h"
|
|
#include "vstgui/lib/platform/win32/winstring.h"
|
|
|
|
#include <windowsx.h>
|
|
|
|
//------------------------------------------------------------------------
|
|
namespace VSTGUI {
|
|
namespace ExternalView {
|
|
|
|
//------------------------------------------------------------------------
|
|
struct Button::Impl : ExternalHWNDBase,
|
|
IControlViewExtension
|
|
{
|
|
using ExternalHWNDBase::ExternalHWNDBase;
|
|
|
|
Type type {};
|
|
EditCallbacks callbacks {};
|
|
double value {0.};
|
|
|
|
bool setValue (double val) override
|
|
{
|
|
value = val;
|
|
auto state = Button_GetState (child);
|
|
switch (type)
|
|
{
|
|
case Type::Checkbox:
|
|
case Type::Radio:
|
|
{
|
|
Button_SetCheck (child, value > 0.5);
|
|
break;
|
|
}
|
|
{
|
|
break;
|
|
}
|
|
case Type::OnOff:
|
|
{
|
|
if (value == 0)
|
|
state = 0; //~BST_PUSHED;
|
|
else
|
|
state = BST_PUSHED;
|
|
Button_SetState (child, state);
|
|
break;
|
|
}
|
|
case Type::Push:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool setEditCallbacks (const EditCallbacks& editCallbacks) override
|
|
{
|
|
callbacks = editCallbacks;
|
|
return true;
|
|
}
|
|
|
|
void onButtonClick (double val)
|
|
{
|
|
if (callbacks.beginEdit)
|
|
callbacks.beginEdit ();
|
|
if (callbacks.performEdit)
|
|
callbacks.performEdit (val);
|
|
if (callbacks.endEdit)
|
|
callbacks.endEdit ();
|
|
}
|
|
};
|
|
|
|
//------------------------------------------------------------------------
|
|
Button::Button (Type type, const UTF8String& inTitle)
|
|
{
|
|
DWORD addStyle = 0;
|
|
switch (type)
|
|
{
|
|
case Type::Checkbox:
|
|
addStyle = BS_AUTOCHECKBOX;
|
|
break;
|
|
case Type::Radio:
|
|
addStyle = BS_RADIOBUTTON;
|
|
break;
|
|
case Type::OnOff:
|
|
addStyle = BS_PUSHBUTTON;
|
|
break;
|
|
case Type::Push:
|
|
addStyle = BS_PUSHBUTTON;
|
|
break;
|
|
}
|
|
auto winString = dynamic_cast<WinString*> (inTitle.getPlatformString ());
|
|
auto hInstance = getPlatformFactory ().asWin32Factory ()->getInstance ();
|
|
impl = std::make_unique<Impl> (hInstance);
|
|
impl->type = type;
|
|
impl->child = CreateWindowExW (WS_EX_COMPOSITED, TEXT ("BUTTON"),
|
|
winString ? winString->getWideString () : nullptr,
|
|
WS_CHILD | WS_VISIBLE | BS_TEXT | addStyle, 0, 0, 80, 20,
|
|
impl->container.getHWND (), NULL, hInstance, NULL);
|
|
impl->container.setWindowProc (
|
|
[this] (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -> LRESULT {
|
|
switch (message)
|
|
{
|
|
case WM_COMMAND:
|
|
{
|
|
if (HIWORD (wParam) == BN_CLICKED)
|
|
{
|
|
switch (impl->type)
|
|
{
|
|
case Type::Checkbox:
|
|
{
|
|
impl->onButtonClick (impl->value == 0. ? 1 : 0.);
|
|
break;
|
|
}
|
|
case Type::Radio:
|
|
{
|
|
impl->onButtonClick (impl->value == 0. ? 1 : 0.);
|
|
break;
|
|
}
|
|
case Type::OnOff:
|
|
{
|
|
impl->onButtonClick (impl->value == 0. ? 1 : 0.);
|
|
break;
|
|
}
|
|
case Type::Push:
|
|
{
|
|
impl->onButtonClick (1.);
|
|
impl->onButtonClick (0.);
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
break;
|
|
}
|
|
case WM_ERASEBKGND:
|
|
return 0;
|
|
}
|
|
return DefWindowProc (hwnd, message, wParam, lParam);
|
|
});
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
Button::~Button () noexcept = default;
|
|
|
|
//------------------------------------------------------------------------
|
|
bool Button::platformViewTypeSupported (PlatformViewType type)
|
|
{
|
|
return impl->platformViewTypeSupported (type);
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
bool Button::attach (void* parent, PlatformViewType parentViewType)
|
|
{
|
|
return impl->attach (parent, parentViewType);
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
bool Button::remove () { return impl->remove (); }
|
|
|
|
//------------------------------------------------------------------------
|
|
void Button::setViewSize (IntRect frame, IntRect visible) { impl->setViewSize (frame, visible); }
|
|
|
|
//------------------------------------------------------------------------
|
|
void Button::setContentScaleFactor (double scaleFactor)
|
|
{
|
|
impl->setContentScaleFactor (scaleFactor);
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
void Button::setMouseEnabled (bool state) { impl->setMouseEnabled (state); }
|
|
|
|
//------------------------------------------------------------------------
|
|
void Button::takeFocus () { impl->takeFocus (); }
|
|
|
|
//------------------------------------------------------------------------
|
|
void Button::looseFocus () { impl->looseFocus (); }
|
|
|
|
//------------------------------------------------------------------------
|
|
void Button::setTookFocusCallback (const TookFocusCallback& callback)
|
|
{
|
|
impl->setTookFocusCallback (callback);
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
bool Button::setValue (double value) { return impl->setValue (value); }
|
|
|
|
//------------------------------------------------------------------------
|
|
bool Button::setEditCallbacks (const EditCallbacks& callbacks)
|
|
{
|
|
return impl->setEditCallbacks (callbacks);
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
} // ExternalView
|
|
} // VSTGUI
|