|
|
@@ -3,11 +3,17 @@
|
|
|
#include "BsScriptGUILayout.h"
|
|
|
#include "BsGUIWidget.h"
|
|
|
#include "BsSceneManager.h"
|
|
|
+#include "BsScriptObjectManager.h"
|
|
|
+#include "BsBuiltinResources.h"
|
|
|
+#include "BsMonoMethod.h"
|
|
|
|
|
|
namespace BansheeEngine
|
|
|
{
|
|
|
SPtr<GUIWidget> ScriptGUI::sGUIWidget;
|
|
|
ScriptGUILayout* ScriptGUI::sPanel = nullptr;
|
|
|
+ HEvent ScriptGUI::sDomainUnloadConn;
|
|
|
+ HEvent ScriptGUI::sDomainLoadConn;
|
|
|
+ MonoMethod* ScriptGUI::sGUIPanelMethod = nullptr;
|
|
|
|
|
|
ScriptGUI::ScriptGUI(MonoObject* managedInstance)
|
|
|
:ScriptObject(managedInstance)
|
|
|
@@ -20,9 +26,30 @@ namespace BansheeEngine
|
|
|
{
|
|
|
CameraPtr mainCamera = gSceneManager().getMainCamera().camera;
|
|
|
sGUIWidget = GUIWidget::create(mainCamera);
|
|
|
+ sGUIWidget->setSkin(BuiltinResources::instance().getGUISkin());
|
|
|
|
|
|
- MonoObject* guiPanel = ScriptGUIPanel::createFromExisting(sGUIWidget->getPanel());
|
|
|
- sPanel = ScriptGUILayout::toNative(guiPanel);
|
|
|
+ auto createPanel = [] ()
|
|
|
+ {
|
|
|
+ assert(sPanel == nullptr);
|
|
|
+
|
|
|
+ MonoObject* guiPanel = ScriptGUIPanel::createFromExisting(sGUIWidget->getPanel());
|
|
|
+ sPanel = ScriptGUILayout::toNative(guiPanel);
|
|
|
+
|
|
|
+ void* params[1];
|
|
|
+ params[0] = guiPanel;
|
|
|
+
|
|
|
+ sGUIPanelMethod->invoke(nullptr, params);
|
|
|
+ };
|
|
|
+
|
|
|
+ auto clearPanel = [] ()
|
|
|
+ {
|
|
|
+ sPanel = nullptr;
|
|
|
+ };
|
|
|
+
|
|
|
+ createPanel();
|
|
|
+
|
|
|
+ sDomainLoadConn = ScriptObjectManager::instance().onRefreshDomainLoaded.connect(createPanel);
|
|
|
+ sDomainUnloadConn = MonoManager::instance().onDomainUnload.connect(clearPanel);
|
|
|
}
|
|
|
|
|
|
void ScriptGUI::update()
|
|
|
@@ -37,6 +64,9 @@ namespace BansheeEngine
|
|
|
|
|
|
void ScriptGUI::shutDown()
|
|
|
{
|
|
|
+ sDomainLoadConn.disconnect();
|
|
|
+ sDomainUnloadConn.disconnect();
|
|
|
+
|
|
|
if (sPanel != nullptr)
|
|
|
{
|
|
|
sPanel->destroy();
|
|
|
@@ -52,8 +82,9 @@ namespace BansheeEngine
|
|
|
|
|
|
void ScriptGUI::initRuntimeData()
|
|
|
{
|
|
|
+ sGUIPanelMethod = metaData.scriptClass->getMethod("SetPanel", 1);
|
|
|
+
|
|
|
metaData.scriptClass->addInternalCall("Internal_SetSkin", &ScriptGUI::internal_SetSkin);
|
|
|
- metaData.scriptClass->addInternalCall("Internal_GetPanel", &ScriptGUI::internal_GetPanel);
|
|
|
}
|
|
|
|
|
|
void ScriptGUI::internal_SetSkin(ScriptGUISkin* skin)
|
|
|
@@ -62,15 +93,10 @@ namespace BansheeEngine
|
|
|
if (skin != nullptr)
|
|
|
guiSkin = skin->getHandle();
|
|
|
|
|
|
+ if (!guiSkin.isLoaded())
|
|
|
+ guiSkin = BuiltinResources::instance().getGUISkin();
|
|
|
+
|
|
|
if(sGUIWidget != nullptr)
|
|
|
sGUIWidget->setSkin(guiSkin);
|
|
|
}
|
|
|
-
|
|
|
- MonoObject* ScriptGUI::internal_GetPanel()
|
|
|
- {
|
|
|
- if (sPanel != nullptr)
|
|
|
- return sPanel->getManagedInstance();
|
|
|
-
|
|
|
- return nullptr;
|
|
|
- }
|
|
|
}
|