Files
UnrealEngine/Engine/Source/Programs/Enterprise/Datasmith/DatasmithARCHICADExporter/Private/Menus.cpp
2025-05-18 13:04:45 +08:00

203 lines
5.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Menus.h"
#include "ResourcesIDs.h"
#include "Utils/Error.h"
#include "Commander.h"
BEGIN_NAMESPACE_UE_AC
// Add menu to the menu bar and also add an item to palette menu
inline static void RegisterMenu(GSErrCode* IOGSErr, short InMenuResId, short InMenuHelpResId, APIMenuCodeID InMenuCode,
GSFlags InMenuFlags)
{
if (*IOGSErr == NoError)
{
*IOGSErr =
ACAPI_Register_Menu(LocalizeResId(InMenuResId), LocalizeResId(InMenuHelpResId), InMenuCode, InMenuFlags);
}
}
#define RegisterMenuAndHelp(IOGSErr, MenuId, MenuCode, MenuFlags) \
RegisterMenu(IOGSErr, MenuId, MenuId##Help, MenuCode, MenuFlags)
// Add menu to the menu bar and also add an item to palette menu
GSErrCode FMenus::Register()
{
GSErrCode GSErr = NoError;
RegisterMenuAndHelp(&GSErr, kStrListMenuDatasmith, MenuCode_Palettes, MenuFlag_Default);
#if !UE_AC_NO_MENU
RegisterMenuAndHelp(&GSErr, kStrListMenuItemSnapshot, MenuCode_UserDef, MenuFlag_Default);
#if AUTO_SYNC
RegisterMenuAndHelp(&GSErr, kStrListMenuItemAutoSync, MenuCode_UserDef, MenuFlag_Default);
#endif
RegisterMenuAndHelp(&GSErr, kStrListMenuItemConnections, MenuCode_UserDef, MenuFlag_Default);
RegisterMenuAndHelp(&GSErr, kStrListMenuItemExport, MenuCode_UserDef, MenuFlag_Default);
RegisterMenuAndHelp(&GSErr, kStrListMenuItemMessages, MenuCode_UserDef, MenuFlag_Default);
RegisterMenuAndHelp(&GSErr, kStrListMenuItemPalette, MenuCode_UserDef, MenuFlag_SeparatorBefore);
RegisterMenuAndHelp(&GSErr, kStrListMenuItemAbout, MenuCode_UserDef, MenuFlag_Default);
#endif
return GSErr;
}
// Enable handlers of menu items
GSErrCode FMenus::Initialize()
{
GSErrCode GSErr = NoError;
#if !UE_AC_NO_MENU
for (short IndexMenu = kStrListMenuItemSnapshot; IndexMenu <= kStrListMenuItemAbout && GSErr == NoError;
IndexMenu++)
{
#if AC_VERSION < 28
GSErr = ACAPI_Install_MenuHandler(LocalizeResId(IndexMenu), MenuCommandHandler);
#else
GSErr = ACAPI_MenuItem_InstallMenuHandler(LocalizeResId(IndexMenu), MenuCommandHandler);
#endif
}
if (GSErr != NoError)
{
UE_AC_DebugF("FMenus::Initialize - ACAPI_Install_MenuHandler error=%s\n", GetErrorName(GSErr));
}
#endif
#if AC_VERSION < 28
GSErr = ACAPI_Install_MenuHandler(LocalizeResId(kStrListMenuDatasmith), MenuCommandHandler);
#else
GSErr = ACAPI_MenuItem_InstallMenuHandler(LocalizeResId(kStrListMenuDatasmith), MenuCommandHandler);
#endif
if (GSErr != NoError)
{
UE_AC_DebugF("FMenus::Initialize - ACAPI_Install_MenuHandler error=%s\n", GetErrorName(GSErr));
}
return GSErr;
}
// Ename or disable menu item
void FMenus::SetMenuItemStatus(short InMenu, short InItem, bool InSet, GSFlags InFlag)
{
#if !UE_AC_NO_MENU
API_MenuItemRef ItemRef;
Zap(&ItemRef);
ItemRef.menuResID = LocalizeResId(InMenu);
ItemRef.itemIndex = InItem;
GSFlags ItemFlags = 0;
GSErrCode GSErr = ACAPI_Interface(APIIo_GetMenuItemFlagsID, &ItemRef, &ItemFlags);
if (GSErr == NoError)
{
if (InSet)
{
ItemFlags |= InFlag;
}
else
{
ItemFlags &= ~InFlag;
}
GSErr = ACAPI_Interface(APIIo_SetMenuItemFlagsID, &ItemRef, &ItemFlags);
if (GSErr != NoError)
{
UE_AC_DebugF("FMenus::SetMenuItemStatus - APIIo_SetMenuItemFlagsID error=%s\n", GetErrorName(GSErr));
}
}
else
{
UE_AC_DebugF("FMenus::SetMenuItemStatus - APIIo_GetMenuItemFlagsID error=%s\n", GetErrorName(GSErr));
}
#else
(void)InMenu; // No unused warnings
(void)InItem;
(void)InSet;
(void)InFlag;
#endif
}
// Change the text of an item
void FMenus::SetMenuItemText(short InMenu, short InItem, const GS::UniString& ItemStr)
{
#if !UE_AC_NO_MENU
API_MenuItemRef ItemRef;
Zap(&ItemRef);
ItemRef.menuResID = LocalizeResId(InMenu);
ItemRef.itemIndex = InItem;
GSErrCode GSErr =
ACAPI_Interface(APIIo_SetMenuItemTextID, &ItemRef, nullptr, const_cast< GS::UniString* >(&ItemStr));
if (GSErr != NoError)
{
UE_AC_DebugF("FMenus::SetMenuItemText - APIIo_SetMenuItemTextID error=%s\n", GetErrorName(GSErr));
}
#else
(void)InMenu; // No unused warnings
(void)InItem;
(void)ItemStr;
#endif
}
// AutoSync status changed
void FMenus::AutoSyncChanged()
{
static const GS::UniString StartAutoSync(GetGSName(kName_StartAutoSync));
static const GS::UniString PauseAutoSync(GetGSName(kName_PauseAutoSync));
#if AUTO_SYNC
SetMenuItemText(kStrListMenuItemAutoSync, 1, FCommander::IsAutoSyncEnabled() ? PauseAutoSync : StartAutoSync);
SetMenuItemStatus(kStrListMenuItemAutoSync, 1, FCommander::IsAutoSyncEnabled(), API_MenuItemChecked);
#endif
}
// Menu command handler
#if AC_VERSION < 28
GSErrCode __ACENV_CALL FMenus::MenuCommandHandler(const API_MenuParams* MenuParams) noexcept
#else
GSErrCode FMenus::MenuCommandHandler(const API_MenuParams* MenuParams) noexcept
#endif
{
return TryFunctionCatchAndAlert("FMenus::DoMenuCommand",
[&MenuParams]() -> GSErrCode { return FMenus::DoMenuCommand(*MenuParams); });
}
// Process menu command
GSErrCode FMenus::DoMenuCommand(const API_MenuParams& MenuParams)
{
short MenuId = MenuParams.menuItemRef.menuResID - LocalizeResId(0);
if (MenuParams.menuItemRef.itemIndex != 1)
{
UE_AC_DebugF("FMenus::DoMenuCommand - Menu %d, Item is %d\n", MenuId, MenuParams.menuItemRef.itemIndex);
}
switch (MenuId)
{
case kStrListMenuItemSnapshot:
FCommander::DoSnapshot();
break;
#if AUTO_SYNC
case kStrListMenuItemAutoSync:
FCommander::ToggleAutoSync();
break;
#endif
case kStrListMenuItemConnections:
FCommander::ShowConnectionsDialog();
break;
case kStrListMenuItemExport:
FCommander::Export3DToFile();
break;
case kStrListMenuItemMessages:
FCommander::ShowMessagesDialog();
break;
case kStrListMenuItemPalette:
FCommander::ShowHidePalette();
break;
case kStrListMenuItemAbout:
FCommander::ShowAboutOf();
break;
case kStrListMenuDatasmith:
FCommander::ShowHidePalette();
break;
}
return GS::NoError;
}
END_NAMESPACE_UE_AC