hollyhock
Loading...
Searching...
No Matches
dialog.hpp
1#pragma once
2#include <cstdint>
3#include "util.hpp"
4
5// pre-declare the class, since a pointer to it is placed in the vtable
6class GUIDialog;
7
9struct GUIDialog_Wrapped_VTable {
25 GUIDialog *me;
26 uint32_t fakeentrypadding[2];
27
28 VTABLE_FAKE_ENTRY(1, 0);
29
30 // Args: event
31 // Return: unknown?
32 VTableFunction<int, struct GUIDialog_OnEvent_Data *> OnEvent;
33
34 VTABLE_FAKE_ENTRY(1, 1);
35
36 // Args: element, unknown0
37 // unknown0 - always pass 0
38 VTableFunction<void, void *, int> AddElement;
39
40 VTABLE_FAKE_ENTRY(4, 2);
41
42 VTableFunction<void> Refresh;
43
44 VTABLE_FAKE_ENTRY(23, 3);
45
46 // Return: dialog result
47 VTableFunction<int> ShowDialog;
48
49 VTABLE_FAKE_ENTRY(20, 4);
50};
51
53struct GUIDialog_Wrapped {
54 uint8_t unknown0[0x10];
55
56 // refer to accessors in GUIDialog class for documentation
57 uint16_t leftX;
58 uint16_t topY;
59 uint16_t rightX;
60 uint16_t bottomY;
61
62 uint8_t unknown1[0x34];
63
64 struct GUIDialog_Wrapped_VTable *vtable;
65
66 uint8_t unknown2[0x58];
67};
68#ifndef __clang__
69static_assert(sizeof(struct GUIDialog_Wrapped) == 0xA8);
70#endif
71
73 uint16_t type;
74
76 uint16_t data;
77
79 void *element;
80
88 constexpr uint16_t GetEventID() {
89 return (type >> 4) - 8;
90 }
91};
92
93class GUIDialog : public Wrapped {
94public:
95 enum Height : int {
96 Height25 = 0,
97 Height55 = 1,
98 Height75 = 2,
99 Height95 = 3,
100 Height35 = 4,
101 Height60 = 5
102 };
103
104 enum Alignment : int {
105 AlignTop = 0,
106 AlignCenter = 1,
107 AlignBottom = 2
108 };
109
110 enum KeyboardState : int {
111 KeyboardStateNone = 0, // 2 gives same effect
112 KeyboardStateMath1 = 1, // 3 gives same effect
113 KeyboardStateMath2 = 4,
114 KeyboardStateMath3 = 5,
115 KeyboardStateTrig = 6,
116 KeyboardStateVar = 7,
117 KeyboardStateABC = 8,
118 KeyboardStateCatalog = 9,
119 KeyboardStateAdvance = 10,
120 KeyboardStateNumber = 11
121 };
122
123 enum DialogResult : int {
124 DialogResultOK = 0x3EA,
125 DialogResultCancel = 0x3EB
126 };
127
128 GUIDialog(
129 enum Height height, enum Alignment alignment,
130 const char* title,
131 enum KeyboardState keyboard
132 );
133
134 virtual int OnEvent(struct GUIDialog_Wrapped *dialog, struct GUIDialog_OnEvent_Data *event);
135
136 uint16_t GetLeftX();
137 uint16_t GetTopY();
138 uint16_t GetRightX();
139 uint16_t GetBottomY();
140
141 void AddElement(GUIElement &element);
142 void Refresh();
143 DialogResult ShowDialog();
144
145private:
146 struct GUIDialog_Wrapped_VTable *m_oldVTable;
147 struct GUIDialog_Wrapped_VTable m_vtable;
148
149 static int OnEvent_Wrap(struct GUIDialog_Wrapped *dialog, struct GUIDialog_OnEvent_Data *event);
150};
Definition dialog.hpp:93
uint16_t GetRightX()
Definition dialog.cpp:85
uint16_t GetBottomY()
Definition dialog.cpp:94
uint16_t GetLeftX()
Definition dialog.cpp:67
void Refresh()
Definition dialog.cpp:113
void AddElement(GUIElement &element)
Definition dialog.cpp:103
DialogResult ShowDialog()
Definition dialog.cpp:122
uint16_t GetTopY()
Definition dialog.cpp:76
Definition util.hpp:78
Definition util.hpp:48
Definition dialog.hpp:72
uint16_t data
Arbitary data. Usage dependent on event and element type.
Definition dialog.hpp:76
constexpr uint16_t GetEventID()
Definition dialog.hpp:88
void * element
The pointer to the internal GUI element class the event refers to.
Definition dialog.hpp:79