?? guiparser.cpp
字號:
#ifdef GUI_REFID_2 page->object.file = RMCatAscii(m_bitmapsPath, "/", "background.jpg", NULL);#else goto invalidPage;#endif } else { page->object.file = RMCatAscii(m_bitmapsPath, "/", str, NULL); } str = pnode->Attribute(XMLX_NODE, true); if (str == (RMascii *)NULL) { RMDBGLOG((GUIPARSERDBG, "Could not read x (ParseOsdPage) ... error\n")); page->object.x = 0; } else { RMasciiToUInt16 (str, &(page->object.x)); } str = pnode->Attribute(XMLY_NODE, true); if (str == (RMascii *)NULL) { RMDBGLOG((GUIPARSERDBG, "Could not read y (ParseOsdPage) ... error\n")); page->object.y = 0; } else { RMasciiToUInt16 (str, &(page->object.y)); } str = pnode->Attribute(XMLVISIBLE_NODE, true); if (str != (RMascii *)NULL) { if (RMCompareAsciiCaseInsensitively (str, "TRUE")) { page->object.visible = TRUE; } else if (RMCompareAsciiCaseInsensitively (str, "FALSE")) { page->object.visible = FALSE; } else { RMDBGLOG((GUIPARSERDBG, "Invalid visible value (ParseScreenFormat) ... error\n")); goto invalidPage; } } else page->object.visible = TRUE; str = pnode->Attribute(XMLDYNPAGE_NODE, true); if (str != (RMascii *)NULL) { if (RMCompareAsciiCaseInsensitively (str, "TRUE")) { page->object.dynamic = TRUE; } else if (RMCompareAsciiCaseInsensitively (str, "FALSE")) { page->object.dynamic = FALSE; } else { RMDBGLOG((GUIPARSERDBG, "Invalid visible value (ParseScreenFormat) ... error\n")); page->object.dynamic = FALSE; } } else page->object.dynamic = FALSE; if(page->object.dynamic) { str = pnode->Attribute(XMLURL_NODE, true); if (str == (RMascii *)NULL) { RMDBGLOG((GUIPARSERDBG, "Could not read url (ParseOsdPage) ... error\n")); goto invalidPage; } else { page->object.url = STRDUP(str); } } str = pnode->Attribute(XMLSELECTEDOBJECT_NODE, true); if (str == (RMascii *)NULL) { RMDBGLOG((GUIPARSERDBG, "Could not read selectedObject ... ignoring\n")); } else { page->selectedObject = STRDUP(str); } RMDBGLOG((GUIPARSERDBG, "osd page : name : %s, file : %s, x=%d, y=%d, visible : %s\n", page->name, page->object.file, page->object.x, page->object.y, page->object.visible?"TRUE":"FALSE")); for(ptempNode = pnode->FirstChildElement(); ptempNode != NULL; ptempNode = ptempNode->NextSiblingElement()) { str = ptempNode->Value(); if (str == (RMascii *)NULL) continue; if (RMCompareAsciiCaseInsensitively (str, XMLEVENTLIST_NODE)) { ParseEventList(ptempNode, (page->events), &(page->nbEvents)); } else if (RMCompareAsciiCaseInsensitively (str, XMLBUTTONLIST_NODE)) { ParseButtonList(ptempNode, (page->buttons), &(page->nbButtons), NULL); } else if (RMCompareAsciiCaseInsensitively (str, XMLSTRINGLIST_NODE)) { ParseStringList(ptempNode, (page->strings), &(page->nbStrings)); } else if (RMCompareAsciiCaseInsensitively (str, XMLBITMAPLIST_NODE)) { ParseBitmapList(ptempNode, (page->bitmaps), &(page->nbBitmaps)); } else if (RMCompareAsciiCaseInsensitively (str, XMLMENULIST_NODE)) { ParseMenuList(ptempNode, (page->menus), &(page->nbMenus)); } else if (RMCompareAsciiCaseInsensitively (str, XMLLISTS_NODE)) { ParseLists(ptempNode, (page->lists), &(page->nbLists)); } else if (RMCompareAsciiCaseInsensitively (str, XMLSLIDER_NODE)) { page->temp = ParseSlider(ptempNode); } else { RMDBGLOG((GUIPARSERDBG, "unknown node [%s] in osdPages\n", str)); } } // set ids page->id = m_nbOsdPages; // page auto key navigation DoPageAutoKeyNavigation(page); RMDBGLOG((GUIPARSERDBG, "end page\n")); return page; invalidPage: FreeOsdPage(page); return (guiOsdPageType*)NULL;}void RMcuracaoGuiParser::FreePanel(guiPanelType *page){ RMuint16 i; if(page == NULL) return; if(page->name != (RMascii *)NULL){ RFREE(page->name); page->name = NULL; } if(page->object.file != (RMascii *)NULL){ RFREE(page->object.file); page->object.file = NULL; } for(i = 0; i < page->nbButtons; i++){ FreeButton(page->buttons[i]); page->buttons[i] = NULL; } if(page->slider) { FreeSlider(page->slider); page->slider = NULL; } RFREE(page);}void RMcuracaoGuiParser::FreeAnimationItem(guiAnimationItem* item){ if(item == NULL) return; if(item->name) { RFREE(item->name); item->name = NULL; } if(item->object.icon) { RFREE(item->object.icon); item->object.icon = NULL; } RFREE(item);}void RMcuracaoGuiParser::FreeMediaControls(guiMediaControls *page){ RMuint16 i; if(page == NULL) return; if(page->file) { RFREE(page->file); page->file = NULL; } for(i = 0; i < 3; i++){ if(page->panels[i]) FreePanel(page->panels[i]); page->panels[i] = NULL; } RFREE(page);}void RMcuracaoGuiParser::FreeTranslations(guiLangTranslations *page){ RMuint16 i,j; if(page == NULL) return; for(i = 0; i < 128; i++){ if(page->translations[i]) { if(page->translations[i]->name) { RFREE(page->translations[i]->name); page->translations[i]->name = NULL; } for(j = 0; j < 10; j ++) { if(page->translations[i]->translations[j]) { RFREE(page->translations[i]->translations[j]); page->translations[i]->translations[j] = NULL; } } RFREE(page->translations[i]); } page->translations[i] = NULL; } RFREE(page);}void RMcuracaoGuiParser::FreeAnimations(guiAnimationType *page){ if(page == NULL) return; FreeAnimationItem(page->item); RFREE(page);}void RMcuracaoGuiParser::FreeOsdPage(guiOsdPageType *page){ RMuint16 i; if(page == NULL) return; if(page->name != (RMascii *)NULL){ RFREE(page->name); page->name = NULL; } if(page->selectedObject != (RMascii *)NULL){ RFREE(page->selectedObject); page->selectedObject = NULL; } if(page->object.file != (RMascii *)NULL){ RFREE(page->object.file); page->object.file = NULL; } if(page->object.url != (RMascii*) NULL) { RFREE(page->object.url); page->object.url = NULL; } if(page->temp != NULL) { FreeSlider(page->temp); //RFREE(page->temp); page->temp = NULL; } for(i = 0; i < page->nbEvents; i++){ FreeEvent(page->events[i]); page->events[i] = NULL; } for(i = 0; i < page->nbButtons; i++){ FreeButton(page->buttons[i]); page->buttons[i] = NULL; } for(i = 0; i < page->nbBitmaps; i++){ FreeBitmap(page->bitmaps[i]); page->bitmaps[i] = NULL; } for(i = 0; i < page->nbMenus; i++){ FreeMenu(page->menus[i]); page->menus[i] = NULL; } for(i = 0; i < page->nbLists; i++){ FreeList(page->lists[i]); page->lists[i] = NULL; } for(i = 0; i < page->nbStrings; i++){ FreeString(page->strings[i]); page->strings[i] = NULL; } RFREE(page);}RMstatus RMcuracaoGuiParser::GetPages( guiOsdPageType *pages[MAX_GUI_PAGES], RMuint16 *nPages){ if(m_nbOsdPages){ RMMemcpy(pages, m_osdPages, sizeof(m_osdPages)); *nPages = m_nbOsdPages; return RM_OK; } return RM_ERROR;}RMstatus RMcuracaoGuiParser::GetMediaControls( guiMediaControls **controls){ //RMMemcpy(controls, m_mediaControls, sizeof(m_mediaControls)); (*controls) = m_mediaControls; return RM_OK;}RMstatus RMcuracaoGuiParser::GetAnimation(guiAnimationType **animation){ //RMMemcpy(controls, m_mediaControls, sizeof(m_mediaControls)); (*animation) = m_loadAnimation; return RM_OK;}// contributed by KARL@KISS//This function will autogenerate navigation routes for buttons and special string types in pages, popups and menus.RMstatus RMcuracaoGuiParser::DoPageAutoKeyNavigation(guiOsdPageType *page){ //Special navigation commands can still be added in the XML file RMuint16 highX = 1000; RMuint16 highY = 1000; RMuint16 lowX = 0; RMuint16 lowY = 0; RMuint8 right = 0; RMuint8 down = 0; RMuint8 left = 0; RMuint8 up = 0; RMuint16 currentX = 0; RMuint16 currentY = 0; RMuint16 targetX = 0; RMuint16 targetY = 0; // buttons within page for(RMuint8 b = 0; b < page->nbButtons; b++){ //Analyse all buttons if more than one currentX = page->buttons[b]->object.x; currentY = page->buttons[b]->object.y; RMDBGLOG((GUIPARSERDBG, "Page button found with coordinates: x %d, y %d\n", currentX, currentY));// printf("Page button found with coordinates: x %d, y %d\n", currentX, currentY); //Find neighbour buttons if any for(RMuint8 c = 0; c < page->nbButtons; c++){ if( page->buttons[c]->object.state != STATE_DISABLED){ targetX = page->buttons[c]->object.x; targetY = page->buttons[c]->object.y; if((b != c) && (targetX == currentX)){ if((currentY > targetY) && (lowY < targetY)) {lowY = targetY; up = c+1;} if((currentY < targetY) && (highY > targetY)) {highY = targetY; down = c+1;} } else if((b != c) && (targetY == currentY)){ if((currentX > targetX) && (lowX < targetX)) {lowX = targetX; left = c+1;} if((currentX < targetX) && (highX > targetX)) {highX = targetX; right = c+1;} } } } //Assign neighbour buttons if available and not previously assigned if(up && page->buttons[b]->keyup == (RMascii*)NULL) page->buttons[b]->keyup = STRDUP(page->buttons[up-1]->name); if(down && page->buttons[b]->keydown == (RMascii*)NULL) page->buttons[b]->keydown = STRDUP(page->buttons[down-1]->name); if(left && page->buttons[b]->keyleft == (RMascii*)NULL) page->buttons[b]->keyleft = STRDUP(page->buttons[left-1]->name); if(right && page->buttons[b]->keyright == (RMascii*)NULL) page->buttons[b]->keyright = STRDUP(page->buttons[right-1]->name); RMDBGLOG((GUIPARSERDBG, "Assigning index: up = %d down = %d left = %d right = %d\n", up, down, left, right));// printf("Assigning index: up = %d down = %d left = %d right = %d\n", up, down, left, right); up = 0; down = 0; left = 0; right = 0; lowX = 0; lowY = 0; highX = 1000; highY = 1000; } // menus within page for(RMuint8 i = 0; i < page->nbMenus; i++){ if(page->menus[i]->nbItems ){ for(RMuint8 j = 0; j < page->menus[i]->nbItems; j++){ if(page->menus[i]->items[j]->nbButtons > 1){ //if(debug)printf("\n*** Page menuButton autonavigation starts for page index: %d\n", a); for(RMuint8 b=0; b < page->menus[i]->items[j]->nbButtons; b++){ currentX = page->menus[i]->items[j]->buttons[b]->object.x; currentY = page->menus[i]->items[j]->buttons[b]->object.y; RMDBGLOG((GUIPARSERDBG, "Menuitem button found with coordinates: x %d, y %d\n", currentX, currentY)); //Find neighbour buttons if any for(RMuint8 c=0; c < page->menus[i]->items[j]->nbButtons; c++){ if( page->menus[i]->items[j]->buttons[c]->object.state != STATE_DISABLED){ targetX = page->menus[i]->items[j]->buttons[c]->object.x; targetY = page->menus[i]->items[j]->buttons[c]->object.y; if((b != c) && (targetX == currentX)){ if((currentY > targetY) && (lowY < targetY)) {lowY = targetY; up = c+1;} if((currentY < targetY) && (highY > targetY)) {highY = targetY; down = c+1;} } else if((b != c) && (targetY == currentY)){ if((currentX > targetX) && (lowX < targetX)) {lowX = targetX; left = c+1;} if((currentX < targetX) && (highX > targetX)) {highX = targetX; right = c+1;} } } } //Assign neighbour buttons if available and not previously assigned if(up && page->menus[i]->items[j]->buttons[b]->keyup == (RMascii*)NULL) page->menus[i]->items[j]->buttons[b]->keyup = STRDUP(page->menus[i]->items[j]->buttons[up-1]->name); if(down && page->menus[i]->items[j]->buttons[b]->keydown == (RMascii*)NULL) page->menus[i]->items[j]->buttons[b]->keydown = STRDUP(page->menus[i]->items[j]->buttons[down-1]->name); if(left && page->menus[i]->items[j]->buttons[b]->keyleft == (RMascii*)NULL) page->menus[i]->items[j]->buttons[b]->keyleft = STRDUP(page->menus[i]->items[j]->buttons[left-1]->name); if(right && page->menus[i]->items[j]->buttons[b]->keyright == (RMascii*)NULL) page->menus[i]->items[j]->buttons[b]->keyright = STRDUP(page->menus[i]->items[j]->buttons[right-1]->name); RMDBGLOG((GUIPARSERDBG, "Assigning index: up = %d down = %d left = %d right = %d\n", up, down, left, right)); up = 0; down = 0; left = 0; right = 0; lowX = 0; lowY = 0; highX = 1000; highY = 1000; } } } } } return RM_OK;}////////////////////////////////////////////////////////////////////////////////// EVENTS////////////////////////////////////////////////////////////////////////////////RMstatus RMcuracaoGuiParser::GetEvents( guiEventType *events[MAX_GUI_EVENTS], RMuint16 *nEvents){ if(m_nbEvents){ RMMemcpy(events, m_Events, sizeof(m_Events)); *nEvents = m_nbEvents; } return RM_OK;}RMstatus RMcuracaoGuiParser::ParseEventList(TiXmlElement *pnode){ TiXmlElement *ptempNode; const RMascii *str; for(ptempNode = pnode->FirstChildElement(); ptempNode != NULL; ptempNode = ptempNode->NextSiblingElement()) { str = ptempNode->Value(); if (str == (RMascii *)NULL) continue; if (RMCompareAsciiCaseInsensitively (str, XMLEVENT_NODE)) { if(m_nbEvents < MAX_GUI_EVENTS) { m_Events[m_nbEvents] = ParseEvent(ptempNode); if(m_Events[m_nbEvents] != (guiEventType*)NULL){ m_nbEvents++; } } else{ RMDBGLOG((GUIPARSERDBG, "Exceed max number of global events (=%d)\n", MAX_GUI_EVENTS)); } } else { RMDBGLOG((GUIPARSERDBG, "unknown node [%s] in global eventList\n", str)); } } return RM_OK;}RMstatus RMcuracaoGuiParser::ParseEventList(
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -