void fgui_draw_triangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint32_t color) { fgui_draw_line(x0, y0, x1, y1, color); fgui_draw_line(x1, y1, x2, y2, color); fgui_draw_line(x2, y2, x0, y0, color); }
// test some fgui primitives void render_stuff(void) { /* draw background */ fgui_fill_rectangle(0, 0, WIDTH, HEIGHT, FGUI_COLOR(221,221,221)); fgui_draw_string("Use TAB to cycle focus", 50, 1*LINEHEIGHT, 0, NULL); fgui_draw_string("line:", 50, 2*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_line(200, 2*LINEHEIGHT, 220, 2*LINEHEIGHT, FGUI_COLOR(0,255,0)); fgui_draw_string("empty rectangle", 50, 3*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_rectangle(200, 3*LINEHEIGHT, 10, 10, FGUI_COLOR(0,0,255)); fgui_draw_string("filled rectangle", 50, 4*LINEHEIGHT, 0, NULL); fgui_fill_rectangle(200, 4*LINEHEIGHT, 10, 10, FGUI_COLOR(0, 255, 0)); fgui_draw_string("circle", 50, 5*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_circle(200, 5*LINEHEIGHT, 5, FGUI_COLOR(255, 255, 255)); //fgui_draw_triangle(50, 50, 55, 55, 60, 50, 0xff); fgui_draw_string("this colored string\nspans multiple\nlines", 200, 6*LINEHEIGHT, FGUI_COLOR(255,0,0), NULL); fgui_draw_string("push button", 50, 8*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_string("2nd push button", 50, 9*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_string("label widget", 50, 11*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_string("combobox", 50, 10*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_string("lineedit", 50, 12*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_application_draw(&app); }
void fgui_listbox_draw(struct fgui_widget *widget) { struct fgui_listbox *listbox = (struct fgui_listbox *)widget; int has_focus = listbox->base.has_focus; int w = -1+listbox->base.area.w; int h = -1+listbox->base.area.h*listbox->num_items; listbox->base.has_focus = true; // avoid the shrinking of unfocused combox. listbox->is_expanded = true; fgui_combobox_type = 1; // Cheap hack to multipurpose combobox fgui_combobox_draw(widget); fgui_combobox_type = 0; // Cheap hack to multipurpose combobox listbox->is_expanded = true; listbox->base.has_focus = has_focus; /* border */ fgui_draw_line(listbox->base.area.x, listbox->base.area.y, listbox->base.area.x+w, listbox->base.area.y, FGUI_COMBOBOX_BORDER_COLOR); fgui_draw_line(listbox->base.area.x, listbox->base.area.y, listbox->base.area.x, listbox->base.area.y+h, FGUI_COMBOBOX_BORDER_COLOR); fgui_draw_line(listbox->base.area.x, listbox->base.area.y+h, listbox->base.area.x+w, listbox->base.area.y+h, FGUI_COLOR(255, 255, 255)); fgui_draw_line(listbox->base.area.x+w, listbox->base.area.y, listbox->base.area.x+w, listbox->base.area.y+h, FGUI_COLOR(255, 255, 255)); /* if focus, draw red border */ if (listbox->base.has_focus) { fgui_draw_rectangle(1+listbox->base.area.x, 1+listbox->base.area.y + listbox->base.area.h * listbox->current_item, w-1, listbox->base.area.h-1, FGUI_COMBOBOX_FOCUS_COLOR); } }
// test some fgui primitives void render_stuff(void) { /* draw background */ fgui_fill_rectangle(0, 0, WIDTH, HEIGHT, FGUI_COLOR(221,221,221)); fgui_draw_string("Use TAB to cycle focus", 100, 1*LINEHEIGHT, 0, NULL); fgui_draw_string("Line", 10, 2*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_line(160, 5+2*LINEHEIGHT, 220, 5+2*LINEHEIGHT, FGUI_COLOR(31,127,31)); fgui_draw_string("Rectangles and Circles", 10, 3*LINEHEIGHT, 0, NULL); fgui_draw_rectangle(160, 3*LINEHEIGHT, 10, 10, FGUI_COLOR(0,0,255)); fgui_fill_rectangle(160+20, 3*LINEHEIGHT, 10, 10, FGUI_COLOR(31, 191, 31)); fgui_fill_rectangle(160+40, 3*LINEHEIGHT, 10, 10, FGUI_COLOR(31, 191, 31)); fgui_draw_rectangle(160+40, 3*LINEHEIGHT, 10, 10, FGUI_COLOR(0,0,255)); fgui_fill_circle(160+65, 5+3*LINEHEIGHT, 5, FGUI_COLOR(255, 255, 255)); fgui_draw_circle(160+65, 5+3*LINEHEIGHT, 5, FGUI_COLOR(120,120,120)); fgui_fill_circle(160+65, 5+3*LINEHEIGHT, 3, FGUI_COLOR(48, 48, 152)); fgui_draw_circle(160+65, 5+3*LINEHEIGHT, 3, FGUI_COLOR(48, 48, 192)); fgui_fill_circle(160+85, 5+3*LINEHEIGHT, 5, FGUI_COLOR(255, 255, 255)); fgui_draw_circle(160+85, 5+3*LINEHEIGHT, 5, FGUI_COLOR(120,120,120)); fgui_fill_circle(160+105, 5+3*LINEHEIGHT, 5, FGUI_COLOR(255, 255, 255)); fgui_draw_circle(160+105, 5+3*LINEHEIGHT, 5, FGUI_COLOR(120,120,120)); fgui_fill_rectangle(10, -6+4*LINEHEIGHT, 110, 2*LINEHEIGHT+2, FGUI_COLOR(255, 255,255)); fgui_draw_string("this colored string\nspans multiple\nlines", 10, -4+4*LINEHEIGHT, FGUI_COLOR(255,0,0), NULL); fgui_draw_string("checkbox", 10, 6*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_string("push button", 10, 7*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_string("2nd push button", 10, 8*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_string("label widget", 10, 10*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_string("combobox", 10, 9*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_draw_string("lineedit", 10, 11*LINEHEIGHT, FGUI_COLOR(0,0,0), NULL); fgui_application_draw(&app); }
void fgui_combobox_draw(struct fgui_widget *widget) { size_t i; struct fgui_combobox *combobox = (struct fgui_combobox *)widget; int n = 1; int h = combobox->base.area.h*n; int x1 = combobox->base.area.x+2; int y1 = combobox->base.area.y; int x2 = x1+combobox->base.area.w-5; int y2 = y1+h-1; if (!combobox->base.has_focus && !fgui_combobox_type) { // Cheap hack combobox->is_expanded = false; } else if (combobox->is_expanded) { n = combobox->num_items; h = combobox->base.area.h*n; y2 = y1+h-1; } /* combobox background */ fgui_fill_rectangle(combobox->base.area.x, combobox->base.area.y, combobox->base.area.w, h, FGUI_COMBOBOX_BG_COLOR); if (fgui_combobox_type == 0){ // Cheap hack to multipurpose combobox /* border */ fgui_draw_line(x1, y1, x2, y1, FGUI_COMBOBOX_BORDER_COLOR); fgui_draw_line(x1, y2, x2, y2, FGUI_COMBOBOX_BORDER_COLOR); fgui_draw_line(x1-2, y1+2, x1-2, y2-2, FGUI_COMBOBOX_BORDER_COLOR); fgui_draw_line(x2+2, y1+2, x2+2, y2-2, FGUI_COMBOBOX_BORDER_COLOR); /* border shading */ fgui_draw_line(x1, 1+y1, x2, 1+y1, FGUI_COMBOBOX_TOP_COLOR); fgui_draw_line(x1, 2+y1, x2, 2+y1, FGUI_COMBOBOX_TOQ_COLOR); fgui_draw_line(x1, 3+y1, x2, 3+y1, FGUI_COMBOBOX_TOR_COLOR); fgui_draw_line(x1, y2-1, x2, y2-1, FGUI_COMBOBOX_BOT_COLOR); fgui_draw_line(x1, y2-2, x2, y2-2, FGUI_COMBOBOX_BOQ_COLOR); fgui_draw_line(x1, y2-3, x2, y2-3, FGUI_COMBOBOX_BOR_COLOR); fgui_draw_line(x1-1, y1+2, x1-1, y2-2, FGUI_COMBOBOX_TOP_COLOR); fgui_draw_line(x2+1, y1+2, x2+1, y2-2, FGUI_COMBOBOX_BOT_COLOR); } if (combobox->is_expanded) { /* highlight current item */ fgui_fill_rectangle(x1-1, y1+1 + combobox->base.area.h * combobox->current_item, combobox->base.area.w-2, combobox->base.area.h-2, FGUI_COMBOBOX_HIGHLIGHT_COLOR); for (i = 0; i < combobox->num_items; i++) { /* current item text */ fgui_draw_string(combobox->items[i].text, x1, combobox->base.area.y+2 + combobox->base.area.h * i, FGUI_COMBOBOX_TEXT_COLOR, NULL); } } else { /* if focus, draw red border */ if (combobox->base.has_focus) { fgui_draw_rectangle(combobox->base.area.x, combobox->base.area.y, combobox->base.area.w, combobox->base.area.h, FGUI_COMBOBOX_FOCUS_COLOR); } /* current item text */ fgui_draw_string(combobox->items[combobox->current_item].text, x1, combobox->base.area.y+2, FGUI_COMBOBOX_TEXT_COLOR, NULL); /* draw arrow to indicate that this is a combobox */ fgui_draw_triangle(combobox->base.area.x + combobox->base.area.w - 15, combobox->base.area.y + combobox->base.area.h / 2 - 2, combobox->base.area.x + combobox->base.area.w - 5, combobox->base.area.y + combobox->base.area.h / 2 - 2, combobox->base.area.x + combobox->base.area.w - 10, combobox->base.area.y + combobox->base.area.h / 2 + 3, FGUI_COMBOBOX_BORDER_COLOR); } if (fgui_combobox_type == 0){ // Cheap hack to multipurpose combobox /* draw rounded border corners */ fgui_set_pixel(x1-1,y1+1, FGUI_COMBOBOX_BORDER_COLOR); fgui_set_pixel(x2+1,y1+1, FGUI_COMBOBOX_BORDER_COLOR); fgui_set_pixel(x1-1,y2-1, FGUI_COMBOBOX_BORDER_COLOR); fgui_set_pixel(x2+1,y2-1, FGUI_COMBOBOX_BORDER_COLOR); } }