203 lines
5.8 KiB
C++
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
|