xProgressBar* pxProgressBarCreate(u16 usX, u16 usY, u16 usW, u16 usH, xWidget *pxWidParent){ xProgressBar *pxW; xProgressBarProps *xP; if (usH < usFontGetStrH(pcBarText, FONT_ASCII_16_X) + 4) usH = usFontGetStrH(pcBarText, FONT_ASCII_16_X) + 4; pxW = pxWidgetCreate(usX, usY, usW, usH, pxWidParent, TRUE); pxW->eType = WidgetProgressBar; vWidgetSetBgColor(pxW, 65535, FALSE); vWidgetSetTransparency(pxW, FALSE); vWidgesSetClickable(pxW, FALSE); pxW->pxDrawHandler = prvDraw; xP = pvMemoryMalloc(sizeof(xProgressBarProps), MEMORY_EXT); xP->usBarColor = ColorMessageHeaderBackground; xP->usExProc = 0; xP->pxBarLabel = pxLabelCreate(0, 0, usW, usFontGetStrH(pcBarText, FONT_ASCII_16_X) + 2, pcBarText, FONT_ASCII_16_X, strlen(pcBarText) + 5, pxW); vLabelSetTextAlign(xP->pxBarLabel, LABEL_ALIGN_CENTER); vLabelSetVerticalAlign(xP->pxBarLabel, LABEL_ALIGN_MIDDLE); pxW->pvProp = xP; return pxW; }
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; }
xConsole * pxConsoleCreate(){ xConsole *pxW; xConsoleProps *xP; u16 usX0, usY0, usX1, usY1; xConsoleWnd = pxWindowCreate(WINDOW_CONSOLE); vWindowSetFullScreen(xConsoleWnd, TRUE); usX0 = 0; usY0 = 0; usX1 = usWidgetGetW(xConsoleWnd); usY1 = usWidgetGetH(xConsoleWnd); if(xDefCon) return NULL; //Console is singleton ATM. if(!xConsoleWnd) return NULL; //У консоли всегда должен быть родитель. Пока должен быть. pxW = pxWidgetAlloc(); if(bWidgetInit(pxW, usX0, usY0, usX1, usY1, xConsoleWnd, TRUE)){ pxW->eType = WidgetConsole; vWidgetSetClickable(pxW, FALSE); vWidgetSetBgColor(pxW, 0, FALSE); xP = pvMemoryMalloc(sizeof(xConsoleProps), MEMORY_EXT); if(!xP) return NULL; xP->ucChXCount = usWidgetGetW(pxW)/CHAR_PLACE_WIDTH; //TODO: Get FontHeight here xP->ucChYCount = usWidgetGetH(pxW)/CHAR_PLACE_HEIGHT; //Using Monotype xP->ucCaretX = 0; xP->ucCaretY = 0; xP->usScroll = 0; xP->xqConsole = xQueueCreate(xP->ucChXCount * xP->ucChYCount, sizeof(char)); if(!xP->xqConsole) return NULL; pxW->pvProp = xP; pxW->pxDrawHandler = prvConsoleDraw; vWriteSetCallback(vConsoleDefPutChar); xDefCon = pxW; return pxW; } vMemoryFree(pxW); return NULL; }
xPictureStack *pxPictureStackCreate(u16 usX, u16 usY, xPicture xPic, xWidget *pxWidParent){ xPictureStack *pxW; xPictureStackProps *xP; xPictureStackItem *xI; pxW = pvMemoryMalloc(sizeof(xWidget), MEMORY_EXT); if(bWidgetInit(pxW, usX, usY, 1, 1, pxWidParent, TRUE)){ bWidgetSetBgPicture(pxW, xPic); xI = pvMemoryMalloc(sizeof(xPictureStackItem), MEMORY_EXT); if(!xI) return NULL; xI->xPic = xPic; xI->pxNext = NULL; xP = pvMemoryMalloc(sizeof(xPictureStackProps), MEMORY_EXT); if(!xP) return NULL; xP->cItemNumber = 0; xP->cItemCount = 1; xP->xItems = xI; pxW->pvProp = xP; pxW->eType = WidgetPictureStack; pxW->pxDrawHandler = prvDraw; return pxW; } else{ vMemoryFree(pxW); return NULL; } }
xWidget * pxWidgetCreate(u16 usX0, u16 usY0, u16 usX1, u16 usY1, xWidget *pxWidParent, bool bUseWH){ xWidget *pxW; pxW = pvMemoryMalloc(sizeof(xWidget), MEMORY_EXT); if(!pxW) return NULL; if(bWidgetInit(pxW, usX0, usY0, usX1, usY1, pxWidParent, bUseWH)) return pxW; else{ vMemoryFree(pxW); return NULL; } }
bool bPictureStackAddItem(xWidget *pxW, xPicture xPic){ xPictureStackProps *xP; xPictureStackItem *xI; xPictureStackItem *xNext; if(!pxW) return FALSE; if(pxW->eType != WidgetPictureStack) return FALSE; xP = pxW->pvProp; if(xP->cItemCount == PICTURE_STACK_MAX_SIZE) return FALSE; //Находим последний элемент в списке xNext = xP->xItems; while(xNext){ xI = xNext; xNext = xI->pxNext; } //Allocate memory for new Item xNext = pvMemoryMalloc(sizeof(xPictureStackItem), MEMORY_EXT); if(!xNext) return NULL; xNext->xPic = xPic; xNext->pxNext = NULL; //TODO: Check Picture Dimensions here xI->pxNext = xNext; xP->cItemCount++; return TRUE; }
xWidget * pxWidgetAlloc(){ return pvMemoryMalloc(sizeof(xWidget), MEMORY_EXT); }