]> icculus.org git repositories - divverent/darkplaces.git/blob - ui.h
-Fixed a bug in drawstring - it used maxlen instead of len in a validity check
[divverent/darkplaces.git] / ui.h
1
2 #ifndef UI_H
3 #define UI_H
4
5 // AK: new passive ui (like the menu stuff)
6 /* some ideas:
7 1. two different structs (one for the ui core code and one for the rest)
8 2. each item has a size field
9 */
10
11 #define UI_EVENT_QUEUE_SIZE 32
12
13 typedef enum { UI_BUTTON, UI_LABEL } ui_control_type;
14
15 typedef struct ui_message_s                     ui_message_t;
16 typedef struct ui_item_s                        *ui_item_t;
17 typedef struct ui_itemlist_s            *ui_itemlist_t;
18 typedef struct ui_message_queue_s       ui_message_queue_t;
19
20 struct ui_item_s
21 {
22         unsigned int size;
23
24         ui_control_type type;
25
26         const char *name; // used for debugging purposes and to identify an object
27
28 //private:
29         // used to build the item list
30         struct ui_item_s *prev, *next; // items are allowed to be freed everywhere
31
32         // called for system events (true means message processed) 
33         int     (*eventhandler)(ui_itemlist_t list, ui_item_t self, ui_message_t *in, ui_message_queue_t *out);
34
35         // z-order (the higher, the later it is drawn)
36         unsigned int zorder;
37
38         // called to draw the object
39         void (*draw)(ui_itemlist_t list, struct ui_item_s * self);
40
41 };
42
43 struct ui_message_s;
44
45 struct ui_itemlist_s
46 {
47         float org_x, org_y;
48
49         ui_item_t selected;
50
51         void (*eventhandler)(struct ui_itemlist_s * list, struct ui_message_s *msg);
52
53 // private:
54         ui_item_t       list;
55 };
56
57 // this is structure contains *all* possible messages
58 enum ui_message_type_e { UI_EVENT_FRAME, UI_EVENT_KEY, UI_EVENT_MOUSE, UI_BUTTON_PRESSED };
59
60 struct ui_ev_key_s
61 {
62         int key, ascii;
63 };
64
65 // in_mouse_x and in_mouse_y can be also used...
66 struct ui_ev_mouse_s
67 {
68         float x, y;
69 };
70
71 union ui_message_data_u
72 {
73         unsigned char reserved;
74         struct ui_ev_key_s key;
75         struct ui_ev_mouse_s mouse;
76 };
77
78 struct ui_message_s
79 {
80         // empty for input messages, but contains a valid item for all other events
81         ui_item_t                               target;
82
83         // used to determine which data struct was used
84         enum ui_message_type_e  type;
85
86         union ui_message_data_u data;
87 };
88
89 struct ui_message_queue_s
90 {
91         unsigned int used;
92         ui_message_t queue[UI_EVENT_QUEUE_SIZE];
93 };
94
95 void UI_Init(void);
96
97 #define UI_MOUSEEVENT   1
98 #define UI_KEYEVENT             2
99 #define UI_FRAME                4
100 void UI_Draw(ui_itemlist_t list);
101
102 void UI_Mouse(ui_itemlist_t list, float x, float y);
103 void UI_Key(ui_itemlist_t list, int key, int ascii);
104
105 // item stuff
106 #define UI_ITEM(item)   ((ui_item_t*)item)
107
108 ui_item_t UI_CloneItem(ui_item_t);
109
110 ui_item_t UI_FindItemByName(ui_itemlist_t, const char *);
111
112 void UI_FreeItem(ui_itemlist_t, ui_item_t);
113 void UI_FreeItemByName(ui_itemlist_t, const char *);
114
115 // itemlist stuff
116 ui_itemlist_t UI_CreateItemList();
117 ui_itemlist_t UI_CloneItemList(ui_itemlist_t);
118 void UI_FreeItemList(ui_itemlist_t);
119
120 void UI_AddItem(ui_itemlist_t list, ui_item_t item);
121
122 // controls
123 #define UI_TEXT_DEFAULT_LENGTH 255
124
125 typedef struct ui_button_s      *ui_button_t;
126 typedef struct ui_label_s       *ui_label_t;
127 typedef struct ui_text_s        *ui_text_t;
128
129 struct ui_label_t
130 {
131         struct ui_item_s item;
132
133         const char *text;
134         float x, y;
135         float r, g, b, a, f;
136 };
137
138 struct ui_button
139 {
140         struct ui_item_s item;
141
142         const char *caption;
143 };
144
145 ui_item_t UI_CreateButton(void); 
146 ui_item_t UI_CreateLabel(void);
147 ui_item_t UI_CreateText(void);
148
149 // AK: new callback system
150 #define UI_MAX_CALLBACK_COUNT 10
151
152 #define UI_SLOTUSED     1
153 typedef struct ui_callback_s
154 {
155         unsigned int flag;
156         void (*keydown) (int num, char ascii);
157         void (*draw)    (void);
158 } ui_callback_t;
159
160 // functions which should be used
161 void UI_Callback_Init(void);
162 void UI_Callback_Reset(void);
163
164 void UI_Callback_SetupSlot(int slotnr, void(*keydownf)(int num, char ascii), void(*drawf)(void));
165 void UI_Callback_ResetSlot(int slotnr);
166 int  UI_Callback_GetFreeSlot(void);
167 int      UI_Callback_IsSlotUsed(int slotnr);
168
169 void UI_Callback_Draw(void);
170 void UI_Callback_KeyDown(int num, char ascii);
171
172 #endif
173