Initial release
This commit is contained in:
+214
@@ -0,0 +1,214 @@
|
||||
// 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 "drawable.h"
|
||||
#include "converters.h"
|
||||
#include "../../lib/cframe.h"
|
||||
#include "../../lib/cdrawcontext.h"
|
||||
#include "../../lib/cgraphicspath.h"
|
||||
#include "../../lib/cgraphicstransform.h"
|
||||
#include "../../uidescription/detail/uiviewcreatorattributes.h"
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
namespace VSTGUI {
|
||||
namespace ScriptingInternal {
|
||||
using namespace std::literals;
|
||||
using namespace TJS;
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------
|
||||
void JavaScriptDrawable::onDraw (CDrawContext* context, const CRect& rect, const CRect& viewSize)
|
||||
{
|
||||
if (!scriptObject)
|
||||
{
|
||||
auto dashLength = std::round ((viewSize.getWidth () * 2 + viewSize.getHeight () * 2) / 40.);
|
||||
CLineStyle ls (CLineStyle::kLineCapButt, CLineStyle::kLineJoinMiter, 0,
|
||||
{dashLength, dashLength});
|
||||
|
||||
auto lineWidth = 1.;
|
||||
auto size = viewSize;
|
||||
size.inset (lineWidth / 2., lineWidth / 2.);
|
||||
context->setLineStyle (ls);
|
||||
context->setLineWidth (lineWidth);
|
||||
context->setFrameColor (kBlackCColor);
|
||||
context->drawRect (size, kDrawStroked);
|
||||
|
||||
ls.setDashPhase (dashLength * lineWidth);
|
||||
context->setLineStyle (ls);
|
||||
context->setFrameColor (kWhiteCColor);
|
||||
context->drawRect (size, kDrawStroked);
|
||||
return;
|
||||
}
|
||||
auto scriptContext = scriptObject->getContext ();
|
||||
if (!scriptContext)
|
||||
return;
|
||||
context->saveGlobalState ();
|
||||
|
||||
drawContext.setDrawContext (context, scriptContext->getUIDescription ());
|
||||
|
||||
CDrawContext::Transform tm (*context, CGraphicsTransform ().translate (viewSize.getTopLeft ()));
|
||||
|
||||
auto rectVar = makeScriptRect (rect);
|
||||
auto scriptRoot = scriptContext->getRoot ();
|
||||
ScriptAddChildScoped scs (*scriptRoot, "view"sv, *scriptObject);
|
||||
ScriptAddChildScoped scs2 (*scriptRoot, "context"sv, drawContext);
|
||||
ScriptAddChildScoped scs3 (*scriptRoot, "rect"sv, rectVar);
|
||||
scriptContext->evalScript ("view.draw(context, rect);"sv);
|
||||
|
||||
drawContext.setDrawContext (nullptr, nullptr);
|
||||
|
||||
context->restoreGlobalState ();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
void JavaScriptDrawable::setup (ViewScriptObject* inObject) { scriptObject = inObject; }
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
bool JavaScriptDrawable::onDrawFocusOnTop ()
|
||||
{
|
||||
auto scriptContext = scriptObject->getContext ();
|
||||
if (!scriptContext)
|
||||
return false;
|
||||
|
||||
if (scriptObject->getVar ()->findChild ("drawFocusOnTop"sv) == nullptr)
|
||||
return false;
|
||||
|
||||
auto scriptRoot = scriptContext->getRoot ();
|
||||
ScriptAddChildScoped scs (*scriptRoot, "view"sv, *scriptObject);
|
||||
auto boolResult = scriptContext->evalScript ("view.drawFocusOnTop();"sv);
|
||||
return boolResult->isNumeric () ? boolResult->getInt () : false;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
bool JavaScriptDrawable::onGetFocusPath (CGraphicsPath& outPath, CCoord focusWidth,
|
||||
const CRect& viewSize)
|
||||
{
|
||||
if (auto scriptContext = scriptObject->getContext ())
|
||||
{
|
||||
if (scriptObject->getVar ()->findChild ("getFocusPath"sv) == nullptr)
|
||||
{
|
||||
auto r = viewSize;
|
||||
outPath.addRect (r);
|
||||
r.extend (focusWidth, focusWidth);
|
||||
outPath.addRect (r);
|
||||
return true;
|
||||
}
|
||||
|
||||
auto scriptRoot = scriptContext->getRoot ();
|
||||
auto path = makeOwned<CGraphicsPath> (outPath);
|
||||
ScriptObject focusWidthVar;
|
||||
focusWidthVar->setDouble (focusWidth);
|
||||
ScriptAddChildScoped scs (*scriptRoot, "view"sv, *scriptObject);
|
||||
ScriptAddChildScoped scs2 (*scriptRoot, "path"sv, makeGraphicsPathScriptObject (path));
|
||||
ScriptAddChildScoped scs3 (*scriptRoot, "focusWidth"sv, focusWidthVar);
|
||||
auto boolResult = scriptContext->evalScript ("view.getFocusPath(path, focusWidth);"sv);
|
||||
if (boolResult->isNumeric ())
|
||||
{
|
||||
if (boolResult->getInt () == 1)
|
||||
{
|
||||
CGraphicsTransform tm;
|
||||
tm.translate (viewSize.left, viewSize.top);
|
||||
outPath.addPath (*path, &tm);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------
|
||||
void JavaScriptDrawableView::drawRect (CDrawContext* context, const CRect& rect)
|
||||
{
|
||||
onDraw (context, rect, getViewSize ());
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
bool JavaScriptDrawableView::drawFocusOnTop ()
|
||||
{
|
||||
if (wantsFocus ())
|
||||
return onDrawFocusOnTop ();
|
||||
return false;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
bool JavaScriptDrawableView::getFocusPath (CGraphicsPath& outPath)
|
||||
{
|
||||
if (wantsFocus ())
|
||||
return onGetFocusPath (outPath, getFrame ()->getFocusWidth (), getViewSize ());
|
||||
return false;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------
|
||||
void JavaScriptDrawableControl::draw (CDrawContext* context) { drawRect (context, getViewSize ()); }
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
void JavaScriptDrawableControl::drawRect (CDrawContext* context, const CRect& rect)
|
||||
{
|
||||
onDraw (context, rect, getViewSize ());
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
bool JavaScriptDrawableControl::drawFocusOnTop ()
|
||||
{
|
||||
if (wantsFocus ())
|
||||
return onDrawFocusOnTop ();
|
||||
return false;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
bool JavaScriptDrawableControl::getFocusPath (CGraphicsPath& outPath)
|
||||
{
|
||||
if (wantsFocus ())
|
||||
return onGetFocusPath (outPath, getFrame ()->getFocusWidth (), getViewSize ());
|
||||
return false;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------
|
||||
IdStringPtr JavaScriptDrawableViewCreator::getViewName () const { return "JavaScriptDrawableView"; }
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
IdStringPtr JavaScriptDrawableViewCreator::getBaseViewName () const
|
||||
{
|
||||
return UIViewCreator::kCView;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
CView* JavaScriptDrawableViewCreator::create (const UIAttributes& attributes,
|
||||
const IUIDescription* description) const
|
||||
{
|
||||
return new JavaScriptDrawableView (CRect ());
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------
|
||||
IdStringPtr JavaScriptDrawableControlCreator::getViewName () const
|
||||
{
|
||||
return "JavaScriptDrawableControl";
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
IdStringPtr JavaScriptDrawableControlCreator::getBaseViewName () const
|
||||
{
|
||||
return UIViewCreator::kCControl;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
CView* JavaScriptDrawableControlCreator::create (const UIAttributes& attributes,
|
||||
const IUIDescription* description) const
|
||||
{
|
||||
return new JavaScriptDrawableControl (CRect ());
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
} // ScriptingInternal
|
||||
} // VSTGUI
|
||||
Reference in New Issue
Block a user