the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 569 lines 18 kB view raw
1#include "stdafx.h" 2#include <xuiresource.h> 3#include <xuiapp.h> 4#include <assert.h> 5 6#include "XUI_Ctrl_4JList.h" 7#include "XUI_Ctrl_4JIcon.h" 8#include "XUI_LoadSettings.h" 9#include "..\..\ProgressRenderer.h" 10#include "XUI_TransferToXboxOne.h" 11 12 13//---------------------------------------------------------------------------------- 14// Performs initialization tasks - retrieves controls. 15//---------------------------------------------------------------------------------- 16HRESULT CScene_TransferToXboxOne::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) 17{ 18 m_iX=-1; 19 m_params = (LoadMenuInitData *)pInitData->pvInitData; 20 21 m_iPad=m_params->iPad; 22 23 m_bRetrievingSaveInfo=false; 24 m_bIgnoreInput=false; 25 MapChildControls(); 26 27 VOID *pObj; 28 XuiObjectFromHandle( m_SavesSlotList, &pObj ); 29 m_pSavesSlotList = (CXuiCtrl4JList *)pObj; 30 31 m_pbImageData=NULL; 32 m_dwImageBytes=0; 33 34 StorageManager.GetSaveCacheFileInfo(m_params->iSaveGameInfoIndex,m_XContentData); 35 StorageManager.GetSaveCacheFileInfo(m_params->iSaveGameInfoIndex,&m_pbImageData,&m_dwImageBytes); 36 37 38 m_SavesSlotListTimer.SetShow(TRUE); 39 40 41 XuiControlSetText(m_SavesSlotList,app.GetString(IDS_XBONE_SELECTSLOT)); 42 43 // insert the current save slot names 44 m_MaxSlotC=app.m_uiTransferSlotC; 45 m_pSlotDataA = new SLOTDATA [m_MaxSlotC]; 46 ZeroMemory(m_pSlotDataA,sizeof(SLOTDATA)*m_MaxSlotC); 47 48 49 // saves will be called slot1 to slotx 50 // there will be a details file with the names and png of each slot 51 m_pbSlotListFile=NULL; 52 m_uiSlotListFileBytes=0; 53 54 if(StorageManager.TMSPP_InFileList(C4JStorage::eGlobalStorage_TitleUser,m_iPad,L"XboxOne/SlotList")) 55 { 56 // there is a slot list file with details of the saves 57 C4JStorage::ETMSStatus status=StorageManager.TMSPP_ReadFile(m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,"XboxOne/SlotList",&CScene_TransferToXboxOne::TMSPPSlotListReturned,this); 58 m_iX=IDS_TOOLTIPS_CLEARSLOTS; 59 } 60 else 61 { 62 CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; 63 64 ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); 65 66 // create dummy slots 67 for(int i=0;i<m_MaxSlotC;i++) 68 { 69 memcpy(m_pSlotDataA[i].wchSaveTitle,app.GetString(IDS_XBONE_EMPTYSLOT),sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH); 70 ListInfo.pwszText = app.GetString(IDS_XBONE_EMPTYSLOT); 71 ListInfo.fEnabled = TRUE; 72 ListInfo.iData = -1; 73 m_pSavesSlotList->AddData(ListInfo); 74 } 75 m_SavesSlotListTimer.SetShow(FALSE); 76 } 77 78 79 CXuiSceneBase::SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, m_iX, -1,-1,-1,-1,-1,-1,true); 80 81 return S_OK; 82} 83 84//---------------------------------------------------------------------------------- 85// TMSPPSlotListReturned callback 86//---------------------------------------------------------------------------------- 87int CScene_TransferToXboxOne::TMSPPWriteReturned(LPVOID pParam,int iPad,int iUserData) 88{ 89 CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) pParam; 90 pClass->m_bWaitingForWrite=false; 91 92 return 0; 93} 94 95//---------------------------------------------------------------------------------- 96// TMSPPSlotListReturned callback 97//---------------------------------------------------------------------------------- 98int CScene_TransferToXboxOne::TMSPPDeleteReturned(LPVOID pParam,int iPad,int iUserData) 99{ 100 CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) pParam; 101 pClass->m_SavesSlotListTimer.SetShow(FALSE); 102 pClass->m_bIgnoreInput=false; 103 104 // update the slots 105 delete pClass->m_pbSlotListFile; 106 pClass->m_pbSlotListFile=NULL; 107 pClass->m_uiSlotListFileBytes=0; 108 pClass->m_pSavesSlotList->RemoveAllData(); 109 CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; 110 111 ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); 112 // clear our slot info 113 ZeroMemory(pClass->m_pSlotDataA,sizeof(SLOTDATA)*pClass->m_MaxSlotC); 114 115 for(int i=0;i<pClass->m_MaxSlotC;i++) 116 { 117 memcpy(pClass->m_pSlotDataA[i].wchSaveTitle,app.GetString(IDS_XBONE_EMPTYSLOT),sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH); 118 ListInfo.pwszText = app.GetString(IDS_XBONE_EMPTYSLOT); 119 ListInfo.fEnabled = TRUE; 120 ListInfo.iData = -1; 121 pClass->m_pSavesSlotList->AddData(ListInfo); 122 } 123 124 return 0; 125} 126 127//---------------------------------------------------------------------------------- 128// TMSPPSlotListReturned callback 129//---------------------------------------------------------------------------------- 130int CScene_TransferToXboxOne::TMSPPSlotListReturned(LPVOID pParam,int iPad,int iUserData,C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename) 131{ 132 CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) pParam; 133 unsigned int uiSlotListFileSlots=*((unsigned int *)pFileData->pbData); 134 pClass->m_pbSlotListFile=pFileData->pbData; 135 pClass->m_uiSlotListFileBytes=pFileData->dwSize; 136 137 // clear our slot info 138 ZeroMemory(pClass->m_pSlotDataA,sizeof(SLOTDATA)*pClass->m_MaxSlotC); 139 // set the empty slot strings 140 for(int i=0;i<pClass->m_MaxSlotC;i++) 141 { 142 memcpy(pClass->m_pSlotDataA[i].wchSaveTitle,app.GetString(IDS_XBONE_EMPTYSLOT),sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH); 143 } 144 // update our slot info with the data from the file - might have less slots 145 unsigned int uiNewSlotsC=(pClass->m_MaxSlotC<uiSlotListFileSlots)?pClass->m_MaxSlotC:uiSlotListFileSlots; 146 memcpy(pClass->m_pSlotDataA,pClass->m_pbSlotListFile + sizeof(unsigned int),sizeof(SLOTDATA)*uiNewSlotsC); 147 148 CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; 149 150 ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); 151 PBYTE pbImageData=pClass->m_pbSlotListFile + sizeof(unsigned int) + sizeof(SLOTDATA)*uiSlotListFileSlots; 152 153 // fill out the slot info 154 for(int i=0;i<pClass->m_MaxSlotC;i++) 155 { 156 if(i<uiNewSlotsC) 157 { 158 ListInfo.pwszText = pClass->m_pSlotDataA[i].wchSaveTitle; 159 ListInfo.fEnabled = TRUE; 160 ListInfo.iData = -1; 161 pClass->m_pSavesSlotList->AddData(ListInfo); 162 163 if(pClass->m_pSlotDataA[i].uiImageLength!=0) 164 { 165 XuiCreateTextureBrushFromMemory(pbImageData,pClass->m_pSlotDataA[i].uiImageLength,&pClass->m_hXuiBrush); 166 pClass->m_pSavesSlotList->UpdateGraphic(i,pClass->m_hXuiBrush); 167 // increment the image data pointer 168 pbImageData+=pClass->m_pSlotDataA[i].uiImageLength; 169 } 170 } 171 else 172 { 173 // make it blank 174 ListInfo.pwszText = app.GetString(IDS_XBONE_EMPTYSLOT); 175 ListInfo.fEnabled = TRUE; 176 ListInfo.iData = -1; 177 pClass->m_pSavesSlotList->AddData(ListInfo); 178 } 179 } 180 pClass->m_SavesSlotListTimer.SetShow(FALSE); 181 return 0; 182 183} 184 185//---------------------------------------------------------------------------------- 186// Handler for OnDestroy 187//---------------------------------------------------------------------------------- 188HRESULT CScene_TransferToXboxOne::OnDestroy() 189{ 190 return S_OK; 191} 192 193//---------------------------------------------------------------------------------- 194// Handler for the button press message. 195//---------------------------------------------------------------------------------- 196HRESULT CScene_TransferToXboxOne::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) 197{ 198 if(m_bIgnoreInput) return S_OK; 199 200 // if we're retrieving save info, ignore key presses 201 if(m_bRetrievingSaveInfo) 202 { 203 return S_OK; 204 } 205 206 // This assumes all buttons can only be pressed with the A button 207 ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); 208 209 if(hObjPressed==m_SavesSlotList) 210 { 211 m_bIgnoreInput=true; 212 213 // update the info in the SlotList file 214 CXuiControl pItem; 215 int iIndex; 216 217 // get the selected item 218 iIndex=m_SavesSlotList.GetCurSel(&pItem); 219 220 // check if there is a save there 221 222 CXuiCtrl4JList::LIST_ITEM_INFO info = m_pSavesSlotList->GetData(iIndex); 223 if(info.pwszImage!=NULL) 224 { 225 // we have a save here 226 // Are you sure, etc. 227 } 228 229 // update the data 230 memcpy(m_pSlotDataA[iIndex].wchSaveTitle,m_XContentData.szDisplayName,sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH); 231 m_pSavesSlotList->UpdateText(iIndex,m_pSlotDataA[iIndex].wchSaveTitle); 232 233 // if there is no thumbnail, retrieve the default one from the file. 234 // Don't delete the image data after creating the xuibrush, since we'll use it in the rename of the save 235 bool bHostOptionsRead = false; 236 unsigned int uiHostOptions = 0; 237 238 XuiCreateTextureBrushFromMemory(m_pbImageData,m_dwImageBytes,&m_hXuiBrush); 239 m_pSavesSlotList->UpdateGraphic(iIndex,m_hXuiBrush); 240 241 m_pSlotDataA[iIndex].uiImageLength=m_dwImageBytes; 242 243 m_bIgnoreInput=false; 244 245 // finished so navigate back 246 //app.NavigateBack(XUSER_INDEX_ANY); 247 BuildSlotFile(iIndex,m_pbImageData,m_dwImageBytes); 248 } 249 250 return S_OK; 251} 252 253HRESULT CScene_TransferToXboxOne::BuildSlotFile(int iIndexBeingUpdated,PBYTE pbImageData,DWORD dwImageBytes ) 254{ 255 SLOTDATA *pCurrentSlotData=NULL; 256 PBYTE pbCurrentSlotDataPtr=NULL; 257 // there may be no slot file yet 258 if(m_pbSlotListFile!=NULL) 259 { 260 pCurrentSlotData=(SLOTDATA *)(m_pbSlotListFile+sizeof(unsigned int)); 261 pbCurrentSlotDataPtr=m_pbSlotListFile + sizeof(unsigned int) + sizeof(SLOTDATA)*m_MaxSlotC; 262 } 263 264 m_uiSlotID=iIndexBeingUpdated; 265 266 // memory required - first int is the number of slots in this file, in case that changes later 267 unsigned int uiBytesRequired=sizeof(unsigned int) + sizeof(SLOTDATA)*m_MaxSlotC; 268 for(int i=0;i<m_MaxSlotC;i++) 269 { 270 if(i==iIndexBeingUpdated) 271 { 272 uiBytesRequired+=dwImageBytes; 273 } 274 else 275 { 276 uiBytesRequired+=m_pSlotDataA[i].uiImageLength; 277 } 278 } 279 280 PBYTE pbNewSlotFileData= new BYTE [uiBytesRequired]; 281 *((unsigned int *)pbNewSlotFileData)=m_MaxSlotC; 282 PBYTE pbNewSlotFileDataSlots=pbNewSlotFileData + sizeof(unsigned int); 283 PBYTE pbNewSlotImageDataPtr=pbNewSlotFileData + sizeof(unsigned int) + sizeof(SLOTDATA)*m_MaxSlotC; 284 SLOTDATA *pNewSlotData=(SLOTDATA *)pbNewSlotFileDataSlots; 285 286 // copy the slot info into the new memory, just after the first int 287 memcpy(pbNewSlotFileDataSlots,m_pSlotDataA,sizeof(SLOTDATA)*m_MaxSlotC); 288 289 for(int i=0;i<m_MaxSlotC;i++) 290 { 291 if(i==iIndexBeingUpdated) 292 { 293 memcpy(pbNewSlotImageDataPtr,pbImageData,dwImageBytes); 294 pbNewSlotImageDataPtr+=dwImageBytes; 295 // update the fields 296 pNewSlotData[i].uiImageLength=dwImageBytes; 297 // save title is already correct 298 } 299 else 300 { 301 if(pbCurrentSlotDataPtr!=NULL) 302 { 303 memcpy(pbNewSlotImageDataPtr,pbCurrentSlotDataPtr,pCurrentSlotData[i].uiImageLength); 304 pbNewSlotImageDataPtr+=pCurrentSlotData[i].uiImageLength; 305 } 306 // fields are already correct 307 } 308 309 // move to the next image data in the current slot file 310 if(pbCurrentSlotDataPtr!=NULL) 311 { 312 pbCurrentSlotDataPtr+=pCurrentSlotData[i].uiImageLength; 313 } 314 } 315 316 // free the previous file data and the current file data 317 delete m_pbSlotListFile; 318 319 // reset the pointer until we have the exit from this scene running 320 m_pbSlotListFile = pbNewSlotFileData; 321 m_uiSlotListFileBytes = uiBytesRequired; 322 m_pSlotDataA = (SLOTDATA *)pbNewSlotFileDataSlots; 323 324 LoadingInputParams *loadingParams = new LoadingInputParams(); 325 loadingParams->func = &CScene_TransferToXboxOne::UploadSaveForXboxOneThreadProc; 326 loadingParams->lpParam = (LPVOID)this; 327 328 UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); 329 completionData->bShowBackground=TRUE; 330 completionData->bShowLogo=TRUE; 331 completionData->iPad = m_iPad; 332 completionData->type = e_ProgressCompletion_NavigateBackToScene; 333 completionData->scene = eUIScene_LoadMenu; 334 loadingParams->completionData = completionData; 335 336 app.NavigateToScene(m_iPad,eUIScene_FullscreenProgress, loadingParams); 337 338 return S_OK; 339} 340 341int CScene_TransferToXboxOne::UploadSaveForXboxOneThreadProc( LPVOID lpParameter ) 342{ 343 HRESULT hr = S_OK; 344 char szFilename[32]; 345 CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) lpParameter; 346 Minecraft *pMinecraft = Minecraft::GetInstance(); 347 unsigned int uiComplete=0; 348 pClass->m_bWaitingForWrite=true; 349 pMinecraft->progressRenderer->progressStart(IDS_XBONE_UPLOAD_SAVE_TITLE); 350 pMinecraft->progressRenderer->progressStage( IDS_XBONE_UPLOAD_METADATA ); 351 // now write the new slot data file to global storage, and then write the save data 352 C4JStorage::ETMSStatus eStatus=StorageManager.TMSPP_WriteFile(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,C4JStorage::TMS_UGCTYPE_NONE,"XboxOne/SlotList",(PCHAR) pClass->m_pbSlotListFile, pClass->m_uiSlotListFileBytes, 353 &CScene_TransferToXboxOne::TMSPPWriteReturned,lpParameter, 0); 354 355 if(eStatus!=C4JStorage::ETMSStatus_WriteInProgress) 356 { 357 // failed 358 pClass->m_bWaitingForWrite=false; 359 } 360 else 361 { 362 // loop waiting for the write to complete 363 uiComplete=0; 364 while(pClass->m_bWaitingForWrite && (hr == S_OK)) 365 { 366 Sleep(50); 367 uiComplete++; 368 if(uiComplete>100) uiComplete=100; 369 370 pMinecraft->progressRenderer->progressStagePercentage(uiComplete); 371 372 if(app.GetChangingSessionType()) 373 { 374 // 4J Stu - This causes the fullscreenprogress scene to ignore the action it was given 375 hr = ERROR_CANCELLED; 376 } 377 } 378 379 if(hr!=S_OK) return -1; 380 381 // finish the bar 382 for(int i=uiComplete;i<100;i++) 383 { 384 Sleep(5); 385 pMinecraft->progressRenderer->progressStagePercentage(i); 386 } 387 388 389 // now upload the save data 390 pMinecraft->progressRenderer->progressStage( IDS_XBONE_UPLOAD_SAVE ); 391 392 // write the save file, and increment the progress percentage 393 pMinecraft->progressRenderer->progressStagePercentage(25); 394 pClass->m_bSaveDataReceived=false; 395 C4JStorage::ELoadGameStatus eLoadStatus=StorageManager.LoadSaveData(&pClass->m_XContentData,CScene_TransferToXboxOne::LoadSaveDataReturned,lpParameter); 396 397 // sleep until we have the data 398 while(pClass->m_bSaveDataReceived==false) 399 { 400 Sleep(50); 401 } 402 403 // write the save to user TMS 404 405 // break the file up into 256K chunks 406 unsigned int uiChunkSize=262144; 407 unsigned int uiBytesLeft=pClass->m_uiStorageLength; 408 C4JStorage::ETMSStatus eStatus; 409 // max file size would be 100*256K 410 unsigned int uiPercentageChunk=100/(pClass->m_uiStorageLength/uiChunkSize); 411 uiComplete=0; 412 413 if(uiPercentageChunk==0) uiPercentageChunk=1; 414 415 for(int i=0;i<(pClass->m_uiStorageLength/uiChunkSize)+1;i++) 416 { 417 sprintf( szFilename, "XboxOne/Slot%.2d%.2d", pClass->m_uiSlotID,i ); 418 PCHAR pchData=((PCHAR)pClass->m_pvSaveMem)+i*uiChunkSize; 419 420 pClass->m_bWaitingForWrite=true; 421 if(uiBytesLeft>=uiChunkSize) 422 { 423 eStatus=StorageManager.TMSPP_WriteFile(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,C4JStorage::TMS_UGCTYPE_NONE,szFilename,pchData, uiChunkSize, 424 &CScene_TransferToXboxOne::TMSPPWriteReturned,lpParameter, 0); 425 uiBytesLeft-=uiChunkSize; 426 } 427 else 428 { 429 // last bit of the file to upload is less than uiChunkSize 430 eStatus=StorageManager.TMSPP_WriteFile(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,C4JStorage::TMS_UGCTYPE_NONE,szFilename,pchData, uiBytesLeft, 431 &CScene_TransferToXboxOne::TMSPPWriteReturned,lpParameter, 0); 432 } 433 434 // wait until 435 if(eStatus!=C4JStorage::ETMSStatus_WriteInProgress) 436 { 437 // failed 438 pClass->m_bWaitingForWrite=false; 439 } 440 else 441 { 442 // loop waiting for the write to complete 443 while(pClass->m_bWaitingForWrite && (hr == S_OK)) 444 { 445 Sleep(50); 446 } 447 uiComplete+=uiPercentageChunk; 448 if(uiComplete>100) uiComplete=100; 449 450 // update the progress 451 pMinecraft->progressRenderer->progressStagePercentage(uiComplete); 452 } 453 } 454 455 456 457 delete pClass->m_pvSaveMem; 458 } 459 return hr; 460} 461 462int CScene_TransferToXboxOne::LoadSaveDataReturned(void *pParam,bool bContinue) 463{ 464 CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne*)pParam; 465 466 if(bContinue==true) 467 { 468 unsigned int uiFileSize = StorageManager.GetSaveSize(); 469 pClass->m_pvSaveMem = new BYTE [uiFileSize]; 470 pClass->m_uiStorageLength=0; 471 472 StorageManager.GetSaveData( pClass->m_pvSaveMem, &pClass->m_uiStorageLength ); 473 474 pClass->m_bSaveDataReceived=true; 475 } 476 477 return 0; 478} 479 480HRESULT CScene_TransferToXboxOne::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) 481{ 482 if(m_bIgnoreInput) return S_OK; 483 484 // if we're retrieving save info, ignore key presses 485 if(m_bRetrievingSaveInfo) 486 { 487 return S_OK; 488 } 489 490 ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); 491 492 HRESULT hr = S_OK; 493 494 // Explicitly handle B button presses 495 switch(pInputData->dwKeyCode) 496 { 497 case VK_PAD_B: 498 case VK_ESCAPE: 499 500 app.NavigateBack(XUSER_INDEX_ANY); 501 rfHandled = TRUE; 502 break; 503 case VK_PAD_X: 504 // wipe the save slots 505 if(m_pbSlotListFile!=NULL) 506 { 507 m_SavesSlotListTimer.SetShow(TRUE); 508 m_bIgnoreInput=true; 509 510 C4JStorage::ETMSStatus eStatus=StorageManager.TMSPP_DeleteFile(m_iPad,"XboxOne/SlotList",C4JStorage::TMS_FILETYPE_BINARY,&CScene_TransferToXboxOne::TMSPPDeleteReturned,this, 0); 511 512 } 513 514 break; 515 } 516 517 return hr; 518} 519 520HRESULT CScene_TransferToXboxOne::OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled) 521{ 522 523 //if(m_bReady) 524 { 525 CXuiSceneBase::PlayUISFX(eSFX_Focus); 526 } 527 528 return S_OK; 529} 530 531 532HRESULT CScene_TransferToXboxOne::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) 533{ 534 //if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; 535 536 if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY || 537 pTransition->dwTransType == XUI_TRANSITION_FROM || pTransition->dwTransType == XUI_TRANSITION_BACKFROM) 538 { 539 // 4J Stu - We may have had to unload our font renderer in this scene if one of the save files 540 // uses characters not in our font (eg asian chars) so restore our font renderer 541 // This will not do anything if our font renderer is already loaded 542 app.OverrideFontRenderer(true,true); 543 } 544 545 return S_OK; 546} 547 548HRESULT CScene_TransferToXboxOne::OnFontRendererChange() 549{ 550 // update the tooltips 551 CXuiSceneBase::SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, m_iX, -1,-1,-1,-1,-1,-1,true); 552 553 return S_OK; 554} 555 556HRESULT CScene_TransferToXboxOne::OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) 557{ 558 // update the tooltips 559 CXuiSceneBase::SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, m_iX, -1,-1,-1,-1,-1,-1,true); 560 561 return S_OK; 562} 563 564HRESULT CScene_TransferToXboxOne::OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) 565{ 566 return S_OK; 567} 568 569