4 // here is the real ui drawing engine
6 #define FRAME_THICKNESS 2
7 #define FRAME_COLOR1 0.2, 0.2, 0.5, 0, 0
8 #define FRAME_COLOR2 0, 0, 0, 0.6, 0
9 #define TEXT_FONTSIZE_X 10
10 #define TEXT_FONTSIZE_Y 10
12 static void UIG_DrawFrame(float x, float y, float w, float h)
15 DrawQ_Fill(x - FRAME_THICKNESS, y - FRAME_THICKNESS, w + 2 * FRAME_THICKNESS, FRAME_THICKNESS, FRAME_COLOR1);
17 DrawQ_Fill(x - FRAME_THICKNESS, y + h, w + 2 * FRAME_THICKNESS, FRAME_THICKNESS, FRAME_COLOR1);
19 DrawQ_Fill(x - FRAME_THICKNESS, y, FRAME_THICKNESS, h, FRAME_COLOR1);
21 DrawQ_Fill(x + w, y, FRAME_THICKNESS, h, FRAME_COLOR1);
23 DrawQ_Fill(x, y, w, h, FRAME_COLOR2);
26 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)
29 DrawQ_SetClipArea(x, y, w, h);
30 DrawQ_String(x, y, text, 0, TEXT_FONTSIZE_X, TEXT_FONTSIZE_Y, r, g, b, a, f);
32 DrawQ_ResetClipArea();
35 #define UIG_DrawPicture DrawQ_Pic
36 #define UIG_Fill DrawQ_Fill
38 static void UIG_DrawCursor(float x, float y, float r, float g, float b, float a, float f)
40 DrawQ_Fill(x,y,1, TEXT_FONTSIZE_Y, r, g, b, a, f);
43 static mempool_t *ui_mem;
45 //#define UI_MEM_SIZE (1 << 10) << 9 // 512 KByte
50 ui_mem = Mem_AllocPool("Intern UI Memory");
53 #define UI_Alloc(size) Mem_Alloc(ui_mem, size)
54 #define UI_Free(ptr) Mem_Free(ptr)
56 void UI_Event(ui_itemlist_t list, ui_message_t *in)
58 ui_message_queue_t out;
63 for(item = list->list; item != 0 && !processed; item = item->next)
67 processed = item->eventhandler(list, item, in, &out);
69 // process posted messages
70 for(i = 0; i < out.used; i++)
71 list->eventhandler(list, &out.queue[i]);
73 if(in->type == UI_EVENT_FRAME)
78 list->eventhandler(list, in);
81 void UI_Draw(ui_itemlist_t list)
83 // firstly we create the frame event here
87 msg.type = UI_EVENT_FRAME;
91 // now draw everything
94 unsigned int depth = 0, nextdepth = ~0;
96 while(depth != nextdepth)
98 for(item = list->list; item != 0; item = item->next)
100 if(item->zorder == depth)
101 item->draw(list, item);
102 if(item->zorder > depth && item->zorder < nextdepth)
103 nextdepth = item->zorder;
111 void UI_Mouse(ui_itemlist_t list, float x, float y)
115 msg.type = UI_EVENT_MOUSE;
117 msg.data.mouse.x = x;
118 msg.data.mouse.y = y;
120 UI_Event(list, &msg);
123 void UI_Key(ui_itemlist_t list, int key, int ascii)
127 msg.type = UI_EVENT_KEY;
129 msg.data.key.key = key;
130 msg.data.key.ascii = ascii;
132 UI_Event(list, &msg);
137 ui_item_t UI_CloneItem(ui_item_t item)
140 clone = UI_Alloc(item->size);
141 clone = memcpy(clone, item, item->size);
146 ui_item_t UI_FindItemByName(ui_itemlist_t list, const char *name)
148 ui_item_t item, found = 0;
151 for(item = list->list; item != 0; item = item->next)
152 if(!strcmp(name, item->name))
161 void UI_FreeItem(ui_itemlist_t list, ui_item_t item)
165 // this is the first item
166 list->list = item->next;
169 item->prev->next = item->next;
170 item->next->prev = item->prev;
175 void UI_FreeItemByName(ui_itemlist_t list, const char *name)
179 item = UI_FindItemByName(list, name);
186 ui_itemlist_t UI_CreateItemList(void)
188 return UI_Alloc(sizeof(ui_itemlist_t));
191 ui_itemlist_t UI_CloneItemList(ui_itemlist_t list)
196 clone = UI_CreateItemList();
199 for(item = list->list; item != 0; item = item->next)
200 UI_AddItem(clone, UI_CloneItem(item));
206 void UI_FreeItemList(ui_itemlist_t list)
208 UI_Free((void*)list);
211 void UI_AddItem(ui_itemlist_t list, ui_item_t item)
214 item->next = list->list;
215 list->list->prev = item;
220 ui_item_t UI_CreateButton(void)
225 ui_item_t UI_CreateLabel(void)
230 ui_item_t UI_CreateText(void)
234 // AK: callback system stuff
235 static ui_callback_t ui_callback_list[UI_MAX_CALLBACK_COUNT];
237 void UI_Callback_Init(void)
239 memset(ui_callback_list, 0, sizeof(ui_callback_list));
242 int UI_Callback_GetFreeSlot(void)
245 for(i = 0; ui_callback_list[i].flag & UI_SLOTUSED && i < UI_MAX_CALLBACK_COUNT; i++);
247 if(i == UI_MAX_CALLBACK_COUNT)
253 int UI_Callback_IsSlotUsed(int slotnr)
255 if(slotnr < 0 || slotnr >= UI_MAX_CALLBACK_COUNT)
257 return (ui_callback_list[slotnr].flag & UI_SLOTUSED);
260 void UI_Callback_SetupSlot(int slotnr, void(*keydownf)(int num, char ascii), void(*drawf)(void))
262 ui_callback_list[slotnr].flag = UI_SLOTUSED;
263 ui_callback_list[slotnr].draw = drawf;
264 ui_callback_list[slotnr].keydown = keydownf;
267 void UI_Callback_ResetSlot(int slotnr)
269 ui_callback_list[slotnr].flag = 0;
272 void UI_Callback_Draw(void)
275 for(i = 0; i < UI_MAX_CALLBACK_COUNT; i++)
276 if(ui_callback_list[i].flag & UI_SLOTUSED && ui_callback_list[i].draw)
277 ui_callback_list[i].draw();
280 void UI_Callback_KeyDown(int num, char ascii)
282 if(ui_callback_list[key_dest - 3].flag & UI_SLOTUSED && ui_callback_list[key_dest - 3].keydown)
283 ui_callback_list[key_dest - 3].keydown(num, ascii);