Files
SuperScriptMaterializer/materializer/PluginMain.cpp

159 lines
4.5 KiB
C++
Raw Normal View History

#include "PluginMain.hpp"
2024-08-02 17:04:37 +08:00
#include "ExportCore.hpp"
#include "ExportDialog.hpp"
namespace VSW::Materializer::PluginMain {
#ifdef MATERIALIZER_PLUGIN
#pragma region Export Dialog Setting
ConfigManager::ConfigManager() :
m_LastFilePath(YYCC_U8("last-file-path"), YYCC_U8("")),
m_Encoding(YYCC_U8("encoding"), CP_ACP),
m_Mgr(ConfigManager::GetConfigFilePath(), UINT64_C(0), {
&m_LastFilePath, &m_Encoding
}) {}
ConfigManager::~ConfigManager() {}
ConfigManager& ConfigManager::GetSingleton() {
static ConfigManager g_Singleton;
return g_Singleton;
}
YYCC::yycc_u8string ConfigManager::GetConfigFilePath() {
// get path to executable virtools
YYCC::yycc_u8string u8_virtools_path;
if (!YYCC::WinFctHelper::GetModuleFileName(NULL, u8_virtools_path))
u8_virtools_path.clear();
// get its parent folder and append with cfg file name
std::filesystem::path virtools_path(YYCC::StdPatch::ToStdPath(u8_virtools_path));
return YYCC::StdPatch::ToUTF8Path(virtools_path.parent_path() / YYCC::StdPatch::ToStdPath(YYCC_U8("vsw_materializer.cfg")));
}
#pragma endregion
PluginInterface* g_Plugininterface = nullptr;
PluginInfo g_PluginInfo;
CMenu* g_MainMenu = nullptr;
static void PluginMenuCallback(int command_id) {
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CKContext* ctx = g_Plugininterface->GetCKContext();
switch (command_id) {
case 0:
{
ExportDialog dialog;
dialog.SetInitialDatabaseType(ExportDialog::InitialDatabaseType::Script);
if (dialog.DoModal() == IDOK) {
ExportScript::Export(ctx, dialog.GetDatabaseFileResult(), dialog.GetEncodingResult());
}
break;
}
case 1:
{
ExportDialog dialog;
dialog.SetInitialDatabaseType(ExportDialog::InitialDatabaseType::Document);
if (dialog.DoModal() == IDOK) {
ExportDocument::Export(ctx, dialog.GetDatabaseFileResult(), dialog.GetEncodingResult());
}
break;
}
case 2:
{
ExportDialog dialog;
dialog.SetInitialDatabaseType(ExportDialog::InitialDatabaseType::Environment);
if (dialog.DoModal() == IDOK) {
ExportEnvironment::Export(ctx, dialog.GetDatabaseFileResult(), dialog.GetEncodingResult());
}
break;
}
case 3:
{
ShellExecuteW(NULL, L"open", L"https://github.com/yyc12345/SuperScriptMaterializer/issues", NULL, NULL, SW_SHOWNORMAL);
break;
}
case 4:
{
const wchar_t* body =
L"VSW Materializer v2.0.0 - Virtools Schematic Weaver Materializer.\n"
L"The exporter of universal Virtools scripts analyser.\n"
L"Under GPL v3 License.\n"
L"Project Home Page: https://github.com/yyc12345/SuperScriptMaterializer";
MessageBoxW(nullptr, body, L"About VSW Materializer", MB_ICONINFORMATION + MB_OK);
break;
}
}
}
static void InitMenu() {
if (!g_Plugininterface)
return;
g_MainMenu = g_Plugininterface->AddPluginMenu("VSW Materializer", 20, NULL, (VoidFunc1Param)PluginMenuCallback);
}
static void RemoveMenu() {
if (!g_Plugininterface || !g_MainMenu)
return;
g_Plugininterface->RemovePluginMenu(g_MainMenu);
}
static void UpdateMenu() {
g_Plugininterface->ClearPluginMenu(g_MainMenu);
2024-08-02 17:04:37 +08:00
g_Plugininterface->AddPluginMenuItem(g_MainMenu, 0, "Export Script");
g_Plugininterface->AddPluginMenuItem(g_MainMenu, 1, "Export Document");
g_Plugininterface->AddPluginMenuItem(g_MainMenu, 2, "Export Environment");
g_Plugininterface->AddPluginMenuItem(g_MainMenu, -1, NULL, TRUE);
g_Plugininterface->AddPluginMenuItem(g_MainMenu, 3, "Report Bug");
g_Plugininterface->AddPluginMenuItem(g_MainMenu, 4, "About VSW Materializer");
g_Plugininterface->UpdatePluginMenu(g_MainMenu);
}
static void PluginCallback(PluginInfo::CALLBACK_REASON reason, PluginInterface* plugininterface) {
switch (reason) {
case PluginInfo::CR_LOAD:
{
g_Plugininterface = plugininterface;
InitMenu();
UpdateMenu();
break;
}
case PluginInfo::CR_UNLOAD:
{
RemoveMenu();
g_Plugininterface = nullptr;
break;
}
case PluginInfo::CR_NEWCOMPOSITIONNAME:
break;
case PluginInfo::CR_NOTIFICATION:
break;
}
}
void InitializePluginInfo() {
strcpy(g_PluginInfo.m_Name, "VSW Materializer");
g_PluginInfo.m_PluginType = PluginInfo::PT_EDITOR;
g_PluginInfo.m_PluginType = (PluginInfo::PLUGIN_TYPE)(g_PluginInfo.m_PluginType | PluginInfo::PTF_RECEIVENOTIFICATION);
g_PluginInfo.m_PluginCallback = PluginCallback;
}
PluginInfo* GetPluginInfo() {
return &g_PluginInfo;
}
PluginInterface* GetPluginInterface() {
return g_Plugininterface;
}
#endif
}