Added scripting quality of life features #299
|
@ -14,6 +14,8 @@
|
|||
#include "Editor/DragDrop/SHDragDrop.hpp"
|
||||
#include "Editor/EditorWindow/MaterialInspector/SHMaterialInspector.h"
|
||||
#include "Editor/EditorWindow/SHEditorWindowManager.h"
|
||||
#include "Scripting/SHVSUtilities.h"
|
||||
#include "Scripting/SHScriptEngine.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -249,6 +251,12 @@ namespace SHADE
|
|||
matInspector->OpenMaterial(asset->id);
|
||||
}
|
||||
break;
|
||||
case AssetType::SCRIPT:
|
||||
if(auto scriptEngine = SHSystemManager::GetSystem<SHScriptEngine>())
|
||||
{
|
||||
scriptEngine->OpenFile(asset->path);
|
||||
}
|
||||
break;
|
||||
case AssetType::MAX_COUNT: break;
|
||||
default:;
|
||||
}
|
||||
|
|
|
@ -306,22 +306,12 @@ namespace SHADE
|
|||
|
||||
void SHScriptEngine::OpenSolution()
|
||||
{
|
||||
// Generate csproj file if it doesn't exist
|
||||
if (!std::filesystem::exists(CSPROJ_PATH))
|
||||
{
|
||||
GenerateScriptsCsProjFile(CSPROJ_PATH);
|
||||
}
|
||||
SHVSUtilties::OpenProject(CSPROJ_PATH);
|
||||
}
|
||||
|
||||
// Open it
|
||||
try
|
||||
{
|
||||
SHVSUtilties::OpenFile(CSPROJ_PATH);
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
SHLOG_ERROR("{}", e.what());
|
||||
SHLOG_ERROR("[SHScriptEngine] Failed to open project csproj file.");
|
||||
}
|
||||
void SHScriptEngine::OpenFile(const std::filesystem::path& path)
|
||||
{
|
||||
SHVSUtilties::OpenFile(CSPROJ_PATH, path);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
|
|
@ -218,9 +218,14 @@ namespace SHADE
|
|||
/// <param name="path">File path to the generated file.</param>
|
||||
void GenerateScriptsCsProjFile(const std::filesystem::path& path = CSPROJ_PATH) const;
|
||||
/// <summary>
|
||||
/// Opens the script solution in Visual Studio 2019.
|
||||
/// Opens the script solution in Visual Studio.
|
||||
/// </summary>
|
||||
void OpenSolution();
|
||||
/// <summary>
|
||||
/// Opens the file in Visual Studio.
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
void OpenFile(const std::filesystem::path& path);
|
||||
|
||||
private:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
|
|
|
@ -22,18 +22,82 @@ namespace SHADE
|
|||
/* Static Data Members */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
std::filesystem::path SHVSUtilties::devEnvPath;
|
||||
HANDLE SHVSUtilties::devEnvInst = nullptr;
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Usage Functions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
void SHVSUtilties::OpenFile(const std::filesystem::path& path)
|
||||
void SHVSUtilties::OpenProject(const std::filesystem::path& projPath)
|
||||
try
|
||||
{
|
||||
if (devEnvPath.empty())
|
||||
// Check if there is an instance
|
||||
bool devEnvActive = false;
|
||||
if (devEnvInst)
|
||||
{
|
||||
devEnvPath = SHVSUtilties::getDevEnvPath();
|
||||
|
||||
DWORD status;
|
||||
const auto GET_CODE_STATUS = GetExitCodeProcess(devEnvInst, &status);
|
||||
devEnvActive = GET_CODE_STATUS && status == STILL_ACTIVE;
|
||||
}
|
||||
|
||||
// Reuse the existing instance if there is one
|
||||
if (devEnvActive)
|
||||
{
|
||||
// No need to reopen one
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (devEnvPath.empty())
|
||||
{
|
||||
devEnvPath = SHVSUtilties::getDevEnvPath();
|
||||
}
|
||||
|
||||
auto absProjPath = std::filesystem::canonical(projPath);
|
||||
auto pi = SHExecUtilties::ExecProcess(devEnvPath.generic_wstring(), L" " + absProjPath.generic_wstring());
|
||||
// Cache the process handle
|
||||
devEnvInst = pi.hProcess;
|
||||
}
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
SHLOG_ERROR("{}", e.what());
|
||||
SHLOG_ERROR("[SHVSUtilities] Failed to launch Visual Studio.");
|
||||
}
|
||||
|
||||
void SHVSUtilties::OpenFile(const std::filesystem::path& projPath, const std::filesystem::path& path)
|
||||
try
|
||||
{
|
||||
// Check if there is an instance
|
||||
bool devEnvActive = false;
|
||||
if (devEnvInst)
|
||||
{
|
||||
|
||||
DWORD status;
|
||||
const auto GET_CODE_STATUS = GetExitCodeProcess(devEnvInst, &status);
|
||||
devEnvActive = GET_CODE_STATUS && status == STILL_ACTIVE;
|
||||
}
|
||||
|
||||
auto absPath = std::filesystem::canonical(path);
|
||||
|
||||
// Reuse the existing instance if there is one
|
||||
if (devEnvActive)
|
||||
{
|
||||
// Edit the file only
|
||||
SHExecUtilties::ExecProcess(devEnvPath.generic_wstring(), L" /Edit " + absPath.generic_wstring());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (devEnvPath.empty())
|
||||
{
|
||||
devEnvPath = SHVSUtilties::getDevEnvPath();
|
||||
}
|
||||
|
||||
auto absProjPath = std::filesystem::canonical(projPath);
|
||||
auto pi = SHExecUtilties::ExecProcess(devEnvPath.generic_wstring(), absProjPath.generic_wstring() + L" " + absPath.generic_wstring());
|
||||
// Cache the process handle
|
||||
devEnvInst = pi.hProcess;
|
||||
}
|
||||
SHExecUtilties::ExecProcess(devEnvPath.generic_wstring(), L"/Edit " + path.generic_wstring());
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
|
@ -51,7 +115,7 @@ namespace SHADE
|
|||
#else
|
||||
static constexpr int EXCESS_CHARS_COUNT = 2;
|
||||
|
||||
const auto RESULT = SHExecUtilties::ExecBlockingPowerShellCommand(L"./vswhere -version \"[15.0,19.0]\" -requires Microsoft.NetCore.Component.DevelopmentTools -find Common7\\\\IDE\\\\devenv.exe | Select-Object -last 1", true, true);
|
||||
const auto RESULT = SHExecUtilties::ExecBlockingPowerShellCommand(L"./vswhere -version \"[15.0,19.0]\" -requires Microsoft.NetCore.Component.DevelopmentTools -find Common7\\\\IDE\\\\devenv.exe | Select-Object -first 1", true, true);
|
||||
if (RESULT.StdOutput.size() < EXCESS_CHARS_COUNT)
|
||||
{
|
||||
SHLOG_ERROR("[SHVSUtilities] Unable to get path to Visual Studio installation. SHVSUtilities will not work.");
|
||||
|
|
|
@ -28,10 +28,18 @@ namespace SHADE
|
|||
/* Usage Functions */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Opens the file at the specified path with a new instance of Visual Studio.
|
||||
/// Opens the project at the specified path with a new or existing instance of Visual
|
||||
/// Studio if it exists.
|
||||
/// </summary>
|
||||
/// <param name="projPath">Path to the project file to open.</param>
|
||||
static void OpenProject(const std::filesystem::path& projPath);
|
||||
/// <summary>
|
||||
/// Opens the file at the specified path with a new or existing instance of Visual
|
||||
/// Studio if it exists.
|
||||
/// </summary>
|
||||
/// <param name="projPath">Path to the project file to open.</param>
|
||||
/// <param name="path">Path to the file to open.</param>
|
||||
static void OpenFile(const std::filesystem::path& path);
|
||||
static void OpenFile(const std::filesystem::path& projPath, const std::filesystem::path& path);
|
||||
|
||||
private:
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
@ -43,6 +51,7 @@ namespace SHADE
|
|||
/* Static Data Members */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
static std::filesystem::path devEnvPath;
|
||||
static HANDLE devEnvInst;
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Helper Functions */
|
||||
|
|
|
@ -22,8 +22,17 @@ namespace SHADE
|
|||
/// </summary>
|
||||
struct SH_API ExecResult final
|
||||
{
|
||||
/// <summary>
|
||||
/// Exit code of the process.
|
||||
/// </summary>
|
||||
DWORD Code;
|
||||
/// <summary>
|
||||
/// Stored text output from the process.
|
||||
/// </summary>
|
||||
std::wstring StdOutput;
|
||||
/// <summary>
|
||||
/// Stored error text output from the process.
|
||||
/// </summary>
|
||||
std::wstring StdErrOutput;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue