Initial release

This commit is contained in:
civ
2026-08-16 18:24:52 +07:00
commit 876886a39a
13244 changed files with 2353959 additions and 0 deletions
@@ -0,0 +1,198 @@
// 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