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; }
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; }
xWidget * pxModalDialogWindowCreate(){ // X0, Y0 - координаты расположения виджетов u16 usX, usY; xThisWnd = pxWindowCreate(WINDOW_MODAL); vWidgetSetBgColor(xThisWnd, ColorEcgBackground, FALSE); vWindowSetOnOpenHandler(xThisWnd, prvOnOpenHandler); vWindowSetOnOpenRequestHandler(xThisWnd, prvOnOpenRequestHandler); vWindowSetOnCloseHandler(xThisWnd, prvOnCloseHandler); vWindowSetOnCloseRequestHandler(xThisWnd, prvOnCloseRequestHandler); xMessageHeader = pxLabelCreate(0, 0, usWidgetGetW(xThisWnd), usStatusBarGetH(), "ModalDialogHeader", FONT_ASCII_16_X, 0, xThisWnd); vWidgetSetBgColor(xMessageHeader, ColorMessageHeaderBackground, FALSE); vLabelSetTextAlign(xMessageHeader, LABEL_ALIGN_CENTER); vLabelSetVerticalAlign(xMessageHeader, LABEL_ALIGN_MIDDLE); vLabelSetTextColor(xMessageHeader, ColorMessageHeaderText); usY = (usInterfaceGetWindowH() * 4 )/10 - usStatusBarGetH(); xMessage = pxLabelCreate(0, usWidgetGetH(xMessageHeader), usWidgetGetW(xThisWnd), usY, "ModalDialogText", FONT_ASCII_16_X, MODAL_DIALOG_MAX_MSG_LENGTH, xThisWnd); bLabelSetMultiline(xMessage, TRUE); vLabelSetTextAlign(xMessage, LABEL_ALIGN_CENTER); vLabelSetVerticalAlign(xMessage, LABEL_ALIGN_MIDDLE); usY = usWidgetGetY1(xMessage, FALSE); xPBar = pxProgressBarCreate(PB_BORDER, usY, usWidgetGetW(xThisWnd) - PB_BORDER * 2, 30, xThisWnd); vProgressBarSetProcExec(xPBar, 55); usY = (usInterfaceGetWindowH()/2 + LCD_TsBtn_SIZE/3); usX = 0; for(int c = 0; c < MODAL_DIALOG_MAX_BUTTONS; c++){ xButtons[c] = pxMenuButtonCreate(usX, usY, pxPictureGet(Pic_ButtonOk), "", prvButtonHandler, xThisWnd); usX += LCD_TsBtn_SIZE; vWidgetHide(xButtons[c]); } return xThisWnd; }
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; }
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; };