Files
Aerofoil/PortabilityLayer/PLDialogs.h

138 lines
3.6 KiB
C
Raw Normal View History

2019-11-11 00:11:59 -05:00
#pragma once
#include "PLCore.h"
namespace PortabilityLayer
{
class DialogItem;
}
2019-12-31 02:42:20 -05:00
template<class T>
class ArrayView;
2019-11-11 00:11:59 -05:00
class PLPasStr;
2019-12-29 23:14:37 -05:00
struct Control;
struct Dialog;
2019-11-11 00:11:59 -05:00
2021-03-29 21:41:11 -04:00
#if GP_ASYNCIFY_PARANOID
namespace DialogFilterFuncs
{
enum DialogFilterFunc
{
kBlowerFilter,
kFurnitureFilter,
kCustPictFilter,
kSwitchFilter,
kTriggerFilter,
kApplianceFilter,
kMicrowaveFilter,
kGreaseFilter,
kInvisBonusFilter,
kTransFilter,
kEnemyFilter,
kFlowerFilter,
kLightFilter,
kGoToFilter,
kRoomFilter,
kOriginalArtFilter,
kAboutFilter,
kLicenseReaderFilter,
kLoadFilter,
kAboutFrameworkFilter,
kBrainsFilter,
kNameFilter,
kBannerFilter,
kControlFilter,
kSoundFilter,
kHouseFilter,
kDisplayFilter,
kPrefsFilter,
kFileBrowserUIImpl_PopUpAlertUIFilter,
kFileBrowserUIImpl_FileBrowserUIFilter,
kDialogManagerImpl_AlertFilter,
};
template<int TFilterFuncID>
int16_t InvokeWrapperThunk(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
template<DialogFilterFunc TFilterFuncID>
class InvokeWrapper
{
public:
inline int16_t operator()(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt) const
{
return InvokeWrapperThunk<TFilterFuncID>(context, dialog, evt);
}
};
}
typedef DialogFilterFuncs::DialogFilterFunc DialogFilterFunc_t;
#define PL_FILTER_FUNC(f) DialogFilterFuncs::k##f, DialogFilterFuncs::InvokeWrapper<DialogFilterFuncs::k##f>()
#define PL_IMPLEMENT_FILTER_FUNCTION_THUNK(f, impl) \
template<> \
int16_t DialogFilterFuncs::InvokeWrapperThunk<DialogFilterFuncs::k##f>(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt) \
{ \
return impl(context, dialog, evt); \
}
#define PL_IMPLEMENT_FILTER_FUNCTION(f) PL_IMPLEMENT_FILTER_FUNCTION_THUNK(f, f)
#else
2020-09-12 22:29:57 -04:00
typedef int16_t(*DialogFilterFunc_t)(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
2021-03-29 21:41:11 -04:00
#define PL_FILTER_FUNC(f) f
#define PL_IMPLEMENT_FILTER_FUNCTION_THUNK(f, impl)
#define PL_IMPLEMENT_FILTER_FUNCTION(f)
#endif
2019-11-11 00:11:59 -05:00
struct DialogTextSubstitutions
{
Str255 m_strings[4];
DialogTextSubstitutions();
explicit DialogTextSubstitutions(const PLPasStr& str0);
DialogTextSubstitutions(const PLPasStr& str0, const PLPasStr& str1);
DialogTextSubstitutions(const PLPasStr& str0, const PLPasStr& str1, const PLPasStr& str2);
DialogTextSubstitutions(const PLPasStr& str0, const PLPasStr& str1, const PLPasStr& str2, const PLPasStr& str3);
private:
void Init(size_t numItems, const PLPasStr *items);
};
2019-12-31 02:42:20 -05:00
struct Dialog
2019-11-11 00:11:59 -05:00
{
2019-12-31 02:42:20 -05:00
virtual void Destroy() = 0;
2019-12-31 02:42:20 -05:00
virtual Window *GetWindow() const = 0;
virtual ArrayView<const PortabilityLayer::DialogItem> GetItems() const = 0;
2019-11-11 00:11:59 -05:00
2020-01-04 01:19:01 -05:00
virtual void SetItemVisibility(unsigned int itemIndex, bool isVisible) = 0;
2021-03-29 21:41:11 -04:00
#if GP_ASYNCIFY_PARANOID
template<class TFilterFunc>
int16_t ExecuteModal(void *captureContext, DialogFilterFunc_t filterFuncID, const TFilterFunc &filterFunc);
#else
2020-09-12 22:29:57 -04:00
virtual int16_t ExecuteModal(void *captureContext, DialogFilterFunc_t filterFunc) = 0;
2021-03-29 21:41:11 -04:00
#endif
2020-03-01 17:01:35 -05:00
virtual bool ReplaceWidget(unsigned int itemIndex, PortabilityLayer::Widget *widget) = 0;
2019-11-11 00:11:59 -05:00
};
2019-12-31 02:42:20 -05:00
typedef Boolean(*ModalFilterUPP)(Dialog *dial, EventRecord *event, short *item);
2019-11-11 00:11:59 -05:00
2019-12-31 02:42:20 -05:00
void DrawDialog(Dialog *dialog);
DrawSurface *GetDialogPort(Dialog *dialog);
2019-11-11 00:11:59 -05:00
2019-12-29 23:14:37 -05:00
void GetDialogItemText(THandle<Control> handle, StringPtr str);
2019-11-11 00:11:59 -05:00
2019-12-31 02:42:20 -05:00
void SetDialogItem(Dialog *dialog, int index, short itemType, THandle<Control> itemHandle, const Rect *itemRect);
2019-12-29 23:14:37 -05:00
void SetDialogItemText(THandle<Control> handle, const PLPasStr &str);
2019-11-11 00:11:59 -05:00
2019-12-31 02:42:20 -05:00
void SelectDialogItemText(Dialog *dialog, int item, int firstSelChar, int lastSelCharExclusive);
2019-11-11 00:11:59 -05:00
2019-12-31 02:42:20 -05:00
void ShowDialogItem(Dialog *dialog, int item);
void HideDialogItem(Dialog *dialog, int item);