#include "PluginMain.hpp" #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::FsPathPatch::FromUTF8Path(u8_virtools_path.c_str())); return YYCC::FsPathPatch::ToUTF8Path(virtools_path.parent_path() / YYCC::FsPathPatch::FromUTF8Path(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); 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 }