void vWidgetSetTransparency(xWidget *pxW, bool bTransparent){ if(!pxW) return; pxW->bTransparent = bTransparent; vWidgetInvalidate(pxW); if(bTransparent) pxW->bInvalidateParent = TRUE; };
int iModalDialogOpen(int iDlgId, char const * sBtns, char const * sHdr, char const* sMsg){ xModalDialog * xDlg; xModalDialog * xDlgNext; /*/Проверка ограничения макс. количества открытых диалогов if(cDialogCount >= MODAL_DIALOG_MAX_COUNT){ vInterfaceOpenWindow(WINDOW_MODAL); return -1; }*/ //Если такой диалог уже активен - Сбросить его обработчики и конфигурацию. if((xDlg = prvDlgIsActive(iDlgId))){ prvDlgRefresh(xDlg, sBtns, sHdr, sMsg); prvDlgShowActive(); vInterfaceOpenWindow(WINDOW_MODAL); return -1; } //Диалог есть где-то в стеке, его надо поднять if((xDlg = prvDlgIsOpened(iDlgId, &xDlgNext))){ prvDlgRefresh(xDlg, sBtns, sHdr, sMsg); prvDelDlgFromStack(xDlg, xDlgNext); }else{ //Диалога в стеке нет, создаем новую структуру xDlg = pvMemoryMalloc(sizeof(xModalDialog), MEMORY_EXT); //cDialogCount ++; memcpy(xDlg->sDialogConfig, sBtns, MODAL_DIALOG_MAX_BUTTONS + 1); xDlg->sDialogConfig[MODAL_DIALOG_MAX_BUTTONS] = '\0'; xDlg->sHdr = sHdr; xDlg->sMsg = sMsg; xDlg->cProgress = -1; xDlg->bCanClose = TRUE; xDlg->pxDefaultHandler = NULL; for(int c = 0; c < MODAL_DIALOG_MAX_BUTTONS; c++) xDlg->pxClickHandlers[c] = NULL; //Выставляем идентификатор диалога, по которому //будет возможность дальнейшей работы с этим диалогом. if(iDlgId != MODAL_AUTO) xDlg->usDlgID = iDlgId; else{ xDlg->usDlgID = usDlgID; prvIncDlgId(); } } //делаем диалог активным xDlg->pxPrev = xMDActive; xMDActive = xDlg; prvDlgShowActive(); vInterfaceOpenWindow(WINDOW_MODAL); vWidgetInvalidate(xThisWnd); return xDlg->usDlgID; }
void vWidgetSetBgColor(xWidget *pxW, u16 usBgColor, bool bTransparent){ if(!pxW) return; pxW->usBgColor = usBgColor; pxW->bTransparent = FALSE; //TODO: handle transparency color??? vWidgetInvalidate(pxW); };
static void prvInvalidateChilds(xWidget *pxW){ if(pxW->pxChild){ xWidget *pxWidChild = pxW->pxChild; while(pxWidChild){ vWidgetInvalidate(pxWidChild); pxWidChild = pxWidChild->pxNextSibling; } } }
bool bWidgetSetBgPicture(xWidget *pxW, unsigned short const* pusBgPicture){ if(!pxW) return FALSE; bool bInvalidateParent = FALSE; if(usPictureGetW(pusBgPicture) < usWidgetGetW(pxW) || usPictureGetH(pusBgPicture) < usWidgetGetH(pxW)) bInvalidateParent = TRUE; if(!bWidgetResize(pxW, usPictureGetW(pusBgPicture), usPictureGetH(pusBgPicture))) return FALSE; //do not invalidate if picture is not changed if(pxW->pusBgPicture != pusBgPicture){ pxW->pusBgPicture = pusBgPicture; vWidgetInvalidate(pxW); } if(!pusBgPicture || bInvalidateParent) pxW->bInvalidateParent = TRUE; return TRUE; };
void vProgressBarSetProcExec(xWidget *pxW, u16 usExecProc){ xProgressBarProps *xP; char pcText[strlen(pcBarText) + 5]; if (!(xP = pxWidgetGetProps(pxW, WidgetProgressBar))) return ; if (usExecProc > 100) usExecProc = 100; if(xP->usExProc == usExecProc) return; sprintf(pcText, "%s %d%c", pcBarText, usExecProc, '%'); pcLabelSetText(xP->pxBarLabel, pcText); xP->usExProc = usExecProc; vWidgetInvalidate(pxW); }
bool bPictureStackSelect(xWidget *pxW, char cItemNumber){ xPictureStackProps *xP; if(!pxW) return FALSE; if(pxW->eType != WidgetPictureStack) return FALSE; xP = pxW->pvProp; if(cItemNumber >= xP->cItemCount) return FALSE; if(cItemNumber == xP->cItemNumber) return TRUE; xP->cItemNumber = cItemNumber; vWidgetInvalidate(pxW); return TRUE; }
void vWidgetSetVisible(xWidget *pxW, bool bVisible){ if(!pxW) return; if(pxW->bVisible == bVisible) return; //TODO: add handling of return values if(bVisible && pxW->pxOnShow) pxW->pxOnShow(pxW); if(!bVisible && pxW->pxOnHide) pxW->pxOnHide(pxW); pxW->bVisible = bVisible; if(!bVisible) pxW->bInvalidateParent = TRUE; else vWidgetInvalidate(pxW); //For now we are unable to hide interface instance (and any that have no parent) //because there's no routine to clear the LCD in that case. }