static bool prvDraw(xWidget *pxW){ xProgressBarProps *xP; if (!(xP = pxWidgetGetProps(pxW, WidgetProgressBar))) return FALSE; if(pxW->bValid) return FALSE; // Draw: bWidgetDraw(pxW); u16 usXfrom = pxW->usX0 + 1; u16 usXto = pxW->usX0 + ((pxW->usX1 - 1 - pxW->usX0) * xP->usExProc) / 100; u16 usYfrom = pxW->usY0 + usWidgetGetH(xP->pxBarLabel); u16 usYto = pxW->usY1 - 1; vFramebufferRectangle(pxW->usX0, usYfrom, pxW->usX1 - 1, usYto, 0, FALSE); usYfrom++; usYto--; while (usXfrom <= usXto - 1){ vFramebufferVLine(usXfrom, usYfrom, usYto, xP->usBarColor); ++usXfrom; } return TRUE; }
void vWidgetDraw(xWidget *pxW){ if(!pxW) return; bool bRedrawed = FALSE; //We don't need to redraw widget and children tree if it is not visible if(!pxW->bVisible) return; if(pxW->bInvalidateParent) return; //Проверка ближайших детей на предмет установленного флага bWidgetInvalidateParent if(pxW->pxChild){ xWidget *pxWidChild = pxW->pxChild; while(pxWidChild){ if(pxWidChild->bInvalidateParent){ pxWidChild->bInvalidateParent = FALSE; pxW->bInvalidate = TRUE; } pxWidChild = pxWidChild->pxNextSibling; } } //анализ флага инвалидации if(pxW->bInvalidate){ prvInvalidateChilds(pxW); pxW->bValid = FALSE; pxW->bInvalidate = FALSE; } if(pxW->pxDrawHandler) bRedrawed = pxW->pxDrawHandler(pxW); else bRedrawed = bWidgetDraw(pxW); if(pxW->pxChild){ xWidget *pxWidChild = pxW->pxChild; while(pxWidChild){ vWidgetDraw(pxWidChild); pxWidChild = pxWidChild->pxNextSibling; } } //Валидируем виджет pxW->bValid = TRUE; if(bInterfaceGetDebug() && bRedrawed) vFramebufferRectangle(pxW->usX0, pxW->usY0, pxW->usX1, pxW->usY1, rand(), FALSE); }
bool bWidgetDraw(xWidget *pxW){ if(!pxW) return FALSE; if(pxW->bValid) return FALSE; if(pxW->pusBgPicture){ bFramebufferPicture(pxW->usX0, pxW->usY0, pxW->pusBgPicture); return TRUE; } if(!pxW->bTransparent){ vFramebufferRectangle(pxW->usX0, pxW->usY0, pxW->usX1, pxW->usY1, pxW->usBgColor, TRUE); return TRUE; } return FALSE; }
bool prvDraw(xConsole *pxW){ xConsoleProps *xP; u16 usX, usY; char cCharOffs = 0; u8 ucPrintChar; u16 usMaxCharPrint; bool bClearRow = FALSE; bool bRedraw = FALSE; xP = pxW->pvProp; usMaxCharPrint = xP->ucChXCount * xP->ucChXCount; if(!xP->xqConsole) return FALSE; while(xQueueReceive( xP->xqConsole, &( ucPrintChar ), 0 ) == pdTRUE){ bRedraw = TRUE; cCharOffs = (CHAR_PLACE_WIDTH - ucFontGetCharW(ucPrintChar, CONSOLE_FONT)) / 2; usX = xP->ucCaretX * CHAR_PLACE_WIDTH + pxW->usX0; usY = xP->ucCaretY * CHAR_PLACE_HEIGHT + pxW->usY0; usX += cCharOffs; if(ucPrintChar != '\n' && ucPrintChar != '\r') { vFramebufferPutChar(usX, usY, ucPrintChar, EM_GUI_SMALL_FONT, CONSOLE_COLOR_FG, CONSOLE_COLOR_BG, FALSE); xP->ucCaretX++; } else{ xP->ucCaretX = 0; xP->ucCaretY++; bClearRow = TRUE; } if(xP->ucCaretX >= xP->ucChXCount){ xP->ucCaretX = 0; xP->ucCaretY++; bClearRow = TRUE; } if(xP->ucCaretY >= xP->ucChYCount){ xP->ucCaretY = 0; bClearRow = TRUE; xP->usScroll = 1; } if(xP->usScroll){ xP->usScroll = CHAR_PLACE_WIDTH * (xP->ucCaretY + 1); } if(xP->usScroll > usWidgetGetH(pxW)) xP->usScroll = 1; vFramebufferScroll(xP->usScroll); //Был перенос строки if(bClearRow){ usX = xP->ucCaretX * CHAR_PLACE_WIDTH + pxW->usX0; usY = xP->ucCaretY * CHAR_PLACE_HEIGHT + pxW->usY0; if(xP->ucCaretY != xP->ucChXCount - 1) vFramebufferRectangle(pxW->usX0, usY, pxW->usX1, usY + CHAR_PLACE_HEIGHT, CONSOLE_COLOR_BG, TRUE); else vFramebufferRectangle(pxW->usX0, usY, pxW->usX1, usY + CHAR_PLACE_HEIGHT, CONSOLE_COLOR_BG, TRUE); bClearRow = FALSE; } if(!usMaxCharPrint) break; usMaxCharPrint--; } return bRedraw; }