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); }