4 // here is the real ui drawing engine
7 #define FRAME_THICKNESS 2
8 #define FRAME_COLOR1 0.2, 0.2, 0.5, 0, 0
9 #define FRAME_COLOR2 0, 0, 0, 0.6, 0
10 #define TEXT_FONTSIZE_X 10
11 #define TEXT_FONTSIZE_Y 10
13 static void UIG_DrawFrame(float x, float y, float w, float h)
16 DrawQ_Fill(x - FRAME_THICKNESS, y - FRAME_THICKNESS, w + 2 * FRAME_THICKNESS, FRAME_THICKNESS, FRAME_COLOR1);
18 DrawQ_Fill(x - FRAME_THICKNESS, y + h, w + 2 * FRAME_THICKNESS, FRAME_THICKNESS, FRAME_COLOR1);
20 DrawQ_Fill(x - FRAME_THICKNESS, y, FRAME_THICKNESS, h, FRAME_COLOR1);
22 DrawQ_Fill(x + w, y, FRAME_THICKNESS, h, FRAME_COLOR1);
24 DrawQ_Fill(x, y, w, h, FRAME_COLOR2);
27 static void UIG_DrawText(const char *text, float x, float y, float w, float h, float r, float g, float b, float a, float f)
30 DrawQ_SetClipArea(x, y, w, h);
31 DrawQ_String(x, y, text, 0, TEXT_FONTSIZE_X, TEXT_FONTSIZE_Y, r, g, b, a, f);
33 DrawQ_ResetClipArea();
36 #define UIG_DrawPicture DrawQ_Pic
37 #define UIG_Fill DrawQ_Fill
39 static void UIG_DrawCursor(float x, float y, float r, float g, float b, float a, float f)
41 DrawQ_Fill(x,y,1, TEXT_FONTSIZE_Y, r, g, b, a, f);
45 //#define UI_MEM_SIZE (1 << 10) << 9 // 512 KByte
52 #define UI_Alloc(size) Mem_Alloc(cl_mempool, size)
53 #define UI_Free(ptr) Mem_Free(ptr)
55 void UI_Event(ui_itemlist_t list, ui_message_t *in)
57 ui_message_queue_t out;
62 for(item = list->list; item != 0 && !processed; item = item->next)
66 processed = item->eventhandler(list, item, in, &out);
68 // process posted messages
69 for(i = 0; i < out.used; i++)
70 list->eventhandler(list, &out.queue[i]);
72 if(in->type == UI_EVENT_FRAME)
77 list->eventhandler(list, in);
80 void UI_Draw(ui_itemlist_t list)
82 // firstly we create the frame event here
86 msg.type = UI_EVENT_FRAME;
90 // now draw everything
93 unsigned int depth = 0, nextdepth = ~0;
95 while(depth != nextdepth)
97 for(item = list->list; item != 0; item = item->next)
99 if(item->zorder == depth)
100 item->draw(list, item);
101 if(item->zorder > depth && item->zorder < nextdepth)
102 nextdepth = item->zorder;
110 void UI_Mouse(ui_itemlist_t list, float x, float y)
114 msg.type = UI_EVENT_MOUSE;
116 msg.data.mouse.x = x;
117 msg.data.mouse.y = y;
119 UI_Event(list, &msg);
122 void UI_Key(ui_itemlist_t list, int key, int ascii)
126 msg.type = UI_EVENT_KEY;
128 msg.data.key.key = key;
129 msg.data.key.ascii = ascii;
131 UI_Event(list, &msg);
136 ui_item_t UI_CloneItem(ui_item_t item)
139 clone = (ui_item_t)UI_Alloc(item->size);
140 memcpy(clone, item, item->size);
145 ui_item_t UI_FindItemByName(ui_itemlist_t list, const char *name)
147 ui_item_t item, found = 0;
150 for(item = list->list; item != 0; item = item->next)
151 if(!strcmp(name, item->name))
160 void UI_FreeItem(ui_itemlist_t list, ui_item_t item)
164 // this is the first item
165 list->list = item->next;
168 item->prev->next = item->next;
169 item->next->prev = item->prev;
174 void UI_FreeItemByName(ui_itemlist_t list, const char *name)
178 item = UI_FindItemByName(list, name);
185 ui_itemlist_t UI_CreateItemList(void)
187 return (ui_itemlist_t)UI_Alloc(sizeof(ui_itemlist_t));
190 ui_itemlist_t UI_CloneItemList(ui_itemlist_t list)
195 clone = UI_CreateItemList();
198 for(item = list->list; item != 0; item = item->next)
199 UI_AddItem(clone, UI_CloneItem(item));
205 void UI_FreeItemList(ui_itemlist_t list)
207 UI_Free((void*)list);
210 void UI_AddItem(ui_itemlist_t list, ui_item_t item)
213 item->next = list->list;
214 list->list->prev = item;
219 ui_item_t UI_CreateButton(void)
224 ui_item_t UI_CreateLabel(void)
229 ui_item_t UI_CreateText(void)
233 // AK: callback system stuff
234 static ui_callback_t ui_callback_list[UI_MAX_CALLBACK_COUNT];
236 void UI_Callback_Init(void)
238 memset(ui_callback_list, 0, sizeof(ui_callback_list));
241 int UI_Callback_GetFreeSlot(void)
244 for(i = 0; ui_callback_list[i].flag & UI_SLOTUSED && i < UI_MAX_CALLBACK_COUNT; i++);
246 if(i == UI_MAX_CALLBACK_COUNT)
252 int UI_Callback_IsSlotUsed(int slotnr)
254 if(slotnr < 0 || slotnr >= UI_MAX_CALLBACK_COUNT)
256 return (ui_callback_list[slotnr].flag & UI_SLOTUSED);
259 void UI_Callback_SetupSlot(int slotnr, void(*keydownf)(int num, char ascii), void(*drawf)(void))
261 ui_callback_list[slotnr].flag = UI_SLOTUSED;
262 ui_callback_list[slotnr].draw = drawf;
263 ui_callback_list[slotnr].keydown = keydownf;
266 void UI_Callback_ResetSlot(int slotnr)
268 ui_callback_list[slotnr].flag = 0;
271 void UI_Callback_Draw(void)
274 for(i = 0; i < UI_MAX_CALLBACK_COUNT; i++)
275 if(ui_callback_list[i].flag & UI_SLOTUSED && ui_callback_list[i].draw)
276 ui_callback_list[i].draw();
279 void UI_Callback_KeyDown(int num, char ascii)
281 if(ui_callback_list[key_dest - 3].flag & UI_SLOTUSED && ui_callback_list[key_dest - 3].keydown)
282 ui_callback_list[key_dest - 3].keydown(num, ascii);