Files
hot-step-cpp-ROCm/engine/vendor/vst3sdk/vstgui4/vstgui/uidescription-scripting/detail/viewscriptobject.cpp
T
2026-08-16 18:24:52 +07:00

210 lines
7.3 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 "viewscriptobject.h"
#include "converters.h"
#include "drawable.h"
#include "../uiscripting.h"
#include "../../uidescription/iviewfactory.h"
#include "../../uidescription/uiattributes.h"
#include "../../lib/cview.h"
#include "../../lib/controls/ccontrol.h"
//------------------------------------------------------------------------
namespace VSTGUI {
namespace ScriptingInternal {
using namespace std::literals;
using namespace TJS;
//------------------------------------------------------------------------
//------------------------------------------------------------------------
//------------------------------------------------------------------------
ViewScriptObject::ViewScriptObject (CView* view, IViewScriptObjectContext* context)
: view (view), context (context)
{
scriptVar->setLifeTimeObserver (this);
auto viewType = IViewFactory::getViewName (view);
scriptVar->addChild ("type"sv, new CScriptVar (std::string (viewType ? viewType : "unknown")));
addFunc ("setAttribute"sv,
[uiDesc = context->getUIDescription (), view] (CScriptVar* var) {
auto key = var->getParameter ("key"sv);
auto value = var->getParameter ("value"sv);
UIAttributes attr;
attr.setAttribute (key->getString ().data (), value->getString ().data ());
auto result = uiDesc->getViewFactory ()->applyAttributeValues (view, attr, uiDesc);
var->getReturnVar ()->setInt (result);
},
{"key", "value"});
addFunc ("getAttribute"sv,
[uiDesc = context->getUIDescription (), view] (CScriptVar* var) {
auto key = var->getParameter ("key"sv);
std::string result;
if (uiDesc->getViewFactory ()->getAttributeValue (view, key->getString ().data (),
result, uiDesc))
{
var->getReturnVar ()->setString (result);
}
else
{
var->getReturnVar ()->setUndefined ();
}
},
{"key"});
addFunc ("isTypeOf"sv,
[uiDesc = context->getUIDescription (), view] (CScriptVar* var) {
auto typeName = var->getParameter ("typeName"sv);
auto result =
uiDesc->getViewFactory ()->viewIsTypeOf (view, typeName->getString ().data ());
var->getReturnVar ()->setInt (result);
},
{"typeName"});
addFunc ("invalid"sv, [view] (CScriptVar* var) { view->invalid (); });
addFunc ("invalidRect"sv,
[view] (CScriptVar* var) {
auto rectVar = var->getParameter ("rect"sv);
if (!rectVar)
throw CScriptException ("Missing 'rect' argument in view.invalidRect(rect) ");
auto rect = fromScriptRect (*rectVar);
view->invalidRect (rect);
},
{"rect"});
addFunc ("getBounds"sv, [view] (CScriptVar* var) {
auto bounds = view->getViewSize ();
bounds.originize ();
var->setReturnVar (makeScriptRect (bounds));
});
addFunc ("getParent"sv, [view, context] (CScriptVar* var) {
auto parentView = view->getParentView ();
if (!parentView)
{
var->getReturnVar ()->setUndefined ();
return;
}
auto obj = context->addView (parentView);
vstgui_assert (obj);
var->setReturnVar (obj->getVar ());
obj->getVar ()->release ();
});
addFunc ("getControllerProperty"sv,
[view] (CScriptVar* var) {
auto viewController = getViewController (view, true);
auto controller = dynamic_cast<IScriptControllerExtension*> (viewController);
auto name = var->getParameter ("name"sv);
if (!controller || !name)
{
var->getReturnVar ()->setUndefined ();
return;
}
IScriptControllerExtension::PropertyValue value;
if (!controller->getProperty (view, name->getString (), value))
{
var->getReturnVar ()->setUndefined ();
return;
}
std::visit (
[&] (auto&& value) {
using T = std::decay_t<decltype (value)>;
if constexpr (std::is_same_v<T, int64_t>)
var->getReturnVar ()->setInt (value);
else if constexpr (std::is_same_v<T, double>)
var->getReturnVar ()->setDouble (value);
else if constexpr (std::is_same_v<T, std::string>)
var->getReturnVar ()->setString (value);
else if constexpr (std::is_same_v<T, std::nullptr_t>)
var->getReturnVar ()->setUndefined ();
},
value);
},
{"name"});
addFunc ("setControllerProperty"sv,
[view] (CScriptVar* var) {
auto viewController = getViewController (view, true);
auto controller = dynamic_cast<IScriptControllerExtension*> (viewController);
auto name = var->getParameter ("name"sv);
auto value = var->getParameter ("value"sv);
if (!controller || !name || !value || !(value->isNumeric () || value->isString ()))
{
var->getReturnVar ()->setUndefined ();
return;
}
IScriptControllerExtension::PropertyValue propValue;
if (value->isInt ())
propValue = value->getInt ();
else if (value->isDouble ())
propValue = value->getDouble ();
else if (value->isString ())
propValue = value->getString ().data ();
auto result = controller->setProperty (view, name->getString (), propValue);
var->getReturnVar ()->setInt (result);
},
{"name", "value"});
if (auto control = dynamic_cast<CControl*> (view))
{
addFunc ("setValue"sv,
[control] (CScriptVar* var) {
auto value = var->getParameter ("value"sv);
if (value->isNumeric ())
{
auto oldValue = control->getValue ();
control->setValue (static_cast<float> (value->getDouble ()));
if (oldValue != control->getValue ())
control->valueChanged ();
}
},
{"value"});
addFunc ("getValue"sv, [control] (CScriptVar* var) {
var->getReturnVar ()->setDouble (control->getValue ());
});
addFunc ("setValueNormalized"sv,
[control] (CScriptVar* var) {
auto value = var->getParameter ("value"sv);
if (value->isNumeric ())
{
auto oldValue = control->getValue ();
control->setValueNormalized (static_cast<float> (value->getDouble ()));
if (oldValue != control->getValue ())
control->valueChanged ();
}
},
{"value"});
addFunc ("getValueNormalized"sv, [control] (CScriptVar* var) {
var->getReturnVar ()->setDouble (control->getValueNormalized ());
});
addFunc ("beginEdit"sv, [control] (CScriptVar* var) { control->beginEdit (); });
addFunc ("endEdit"sv, [control] (CScriptVar* var) { control->endEdit (); });
addFunc ("getMinValue"sv, [control] (CScriptVar* var) {
var->getReturnVar ()->setDouble (control->getMin ());
});
addFunc ("getMaxValue"sv, [control] (CScriptVar* var) {
var->getReturnVar ()->setDouble (control->getMax ());
});
addFunc ("getTag"sv, [control] (CScriptVar* var) {
var->getReturnVar ()->setInt (control->getTag ());
});
}
if (auto drawable = dynamic_cast<JavaScriptDrawable*> (view))
drawable->setup (this);
}
//------------------------------------------------------------------------
ViewScriptObject::~ViewScriptObject () noexcept
{
if (scriptVar)
scriptVar->setLifeTimeObserver (nullptr);
}
//------------------------------------------------------------------------
void ViewScriptObject::onDestroy (CScriptVar* v)
{
v->setLifeTimeObserver (nullptr);
scriptVar = nullptr;
if (context)
context->removeView (view);
}
//------------------------------------------------------------------------
} // ScriptingInternal
} // VSTGUI