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 static mempool_t *ui_mem;
47 //#define UI_MEM_SIZE (1 << 10) << 9 // 512 KByte
52 ui_mem = Mem_AllocPool("Intern UI Memory", 0, NULL);
55 #define UI_Alloc(size) Mem_Alloc(ui_mem, size)
56 #define UI_Free(ptr) Mem_Free(ptr)
58 void UI_Event(ui_itemlist_t list, ui_message_t *in)
60 ui_message_queue_t out;
65 for(item = list->list; item != 0 && !processed; item = item->next)
69 processed = item->eventhandler(list, item, in, &out);
71 // process posted messages
72 for(i = 0; i < out.used; i++)
73 list->eventhandler(list, &out.queue[i]);
75 if(in->type == UI_EVENT_FRAME)
80 list->eventhandler(list, in);
83 void UI_Draw(ui_itemlist_t list)
85 // firstly we create the frame event here
89 msg.type = UI_EVENT_FRAME;
93 // now draw everything
96 unsigned int depth = 0, nextdepth = ~0;
98 while(depth != nextdepth)
100 for(item = list->list; item != 0; item = item->next)
102 if(item->zorder == depth)
103 item->draw(list, item);
104 if(item->zorder > depth && item->zorder < nextdepth)
105 nextdepth = item->zorder;
113 void UI_Mouse(ui_itemlist_t list, float x, float y)
117 msg.type = UI_EVENT_MOUSE;
119 msg.data.mouse.x = x;
120 msg.data.mouse.y = y;
122 UI_Event(list, &msg);
125 void UI_Key(ui_itemlist_t list, int key, int ascii)
129 msg.type = UI_EVENT_KEY;
131 msg.data.key.key = key;
132 msg.data.key.ascii = ascii;
134 UI_Event(list, &msg);
139 ui_item_t UI_CloneItem(ui_item_t item)
142 clone = UI_Alloc(item->size);
143 clone = memcpy(clone, item, item->size);
148 ui_item_t UI_FindItemByName(ui_itemlist_t list, const char *name)
150 ui_item_t item, found = 0;
153 for(item = list->list; item != 0; item = item->next)
154 if(!strcmp(name, item->name))
163 void UI_FreeItem(ui_itemlist_t list, ui_item_t item)
167 // this is the first item
168 list->list = item->next;
171 item->prev->next = item->next;
172 item->next->prev = item->prev;
177 void UI_FreeItemByName(ui_itemlist_t list, const char *name)
181 item = UI_FindItemByName(list, name);
188 ui_itemlist_t UI_CreateItemList(void)
190 return UI_Alloc(sizeof(ui_itemlist_t));
193 ui_itemlist_t UI_CloneItemList(ui_itemlist_t list)
198 clone = UI_CreateItemList();
201 for(item = list->list; item != 0; item = item->next)
202 UI_AddItem(clone, UI_CloneItem(item));
208 void UI_FreeItemList(ui_itemlist_t list)
210 UI_Free((void*)list);
213 void UI_AddItem(ui_itemlist_t list, ui_item_t item)
216 item->next = list->list;
217 list->list->prev = item;
222 ui_item_t UI_CreateButton(void)
227 ui_item_t UI_CreateLabel(void)
232 ui_item_t UI_CreateText(void)
236 // AK: callback system stuff
237 static ui_callback_t ui_callback_list[UI_MAX_CALLBACK_COUNT];
239 void UI_Callback_Init(void)
241 memset(ui_callback_list, 0, sizeof(ui_callback_list));
244 int UI_Callback_GetFreeSlot(void)
247 for(i = 0; ui_callback_list[i].flag & UI_SLOTUSED && i < UI_MAX_CALLBACK_COUNT; i++);
249 if(i == UI_MAX_CALLBACK_COUNT)
255 int UI_Callback_IsSlotUsed(int slotnr)
257 if(slotnr < 0 || slotnr >= UI_MAX_CALLBACK_COUNT)
259 return (ui_callback_list[slotnr].flag & UI_SLOTUSED);
262 void UI_Callback_SetupSlot(int slotnr, void(*keydownf)(int num, char ascii), void(*drawf)(void))
264 ui_callback_list[slotnr].flag = UI_SLOTUSED;
265 ui_callback_list[slotnr].draw = drawf;
266 ui_callback_list[slotnr].keydown = keydownf;
269 void UI_Callback_ResetSlot(int slotnr)
271 ui_callback_list[slotnr].flag = 0;
274 void UI_Callback_Draw(void)
277 for(i = 0; i < UI_MAX_CALLBACK_COUNT; i++)
278 if(ui_callback_list[i].flag & UI_SLOTUSED && ui_callback_list[i].draw)
279 ui_callback_list[i].draw();
282 void UI_Callback_KeyDown(int num, char ascii)
284 if(ui_callback_list[key_dest - 3].flag & UI_SLOTUSED && ui_callback_list[key_dest - 3].keydown)
285 ui_callback_list[key_dest - 3].keydown(num, ascii);