// TODO: Tests (not yet used, see #809). std::vector<GfModule*> GfModule::loadFromDir(const std::string& strDirPath, bool bUseChildDirs) { std::vector<GfModule*> vecModules; GfLogDebug("GfModule::loadFromDir(%s)\n", strDirPath.c_str()); // Get the list of files/sub-dirs in the folder. tFList* lstFilesOrDirs = GfDirGetList(strDirPath.c_str()); if (lstFilesOrDirs) { // Filter module shared libraries and try and load each of them. tFList* pFileOrDir = lstFilesOrDirs; do { // Ignore "." and ".." folders. if (pFileOrDir->name[0] == '.') continue; GfLogDebug(" Examining %s\n", pFileOrDir->name); // Build module shared library path-name (consider only foders, not files). std::ostringstream ossShLibPath; ossShLibPath << strDirPath << '/' << pFileOrDir->name; if (bUseChildDirs) ossShLibPath << '/' << pFileOrDir->name; ossShLibPath << DLLEXT; // Check existence. if (!GfFileExists(ossShLibPath.str().c_str())) continue; // Try and load. GfModule* pModule = GfModule::load(ossShLibPath.str().c_str()); if (pModule) vecModules.push_back(pModule); else GfLogWarning("Failed to load module %s\n", ossShLibPath.str().c_str()); } while ((pFileOrDir = pFileOrDir->next) != lstFilesOrDirs); } return vecModules; }
/** File selection @param vs Pointer on tRmFileSelect structure (cast to void) @return none */ void RmFileSelect(void *vs) { tFList *FileCur; rmFs = (tRmFileSelect*)vs; if (scrHandle) { GfuiScreenRelease(scrHandle); } scrHandle = GfuiScreenCreateEx((float*)NULL, NULL, rmActivate, NULL, (tfuiCallback)NULL, 1); GfuiScreenAddBgImg(scrHandle, "data/img/splash-filesel.png"); GfuiTitleCreate(scrHandle, rmFs->title, 0); /* Scroll List containing the File list */ fileScrollList = GfuiScrollListCreate(scrHandle, GFUI_FONT_MEDIUM_C, 120, 80, GFUI_ALIGN_HC_VB, 400, 310, GFUI_SB_RIGHT, NULL, rmClickOnFile); FileList = GfDirGetList(rmFs->path); if (FileList == NULL) { GfuiScreenActivate(rmFs->prevScreen); return; } FileSelected = FileList; FileCur = FileList; do { FileCur = FileCur->next; GfuiScrollListInsertElement(scrHandle, fileScrollList, FileCur->name, 1000, (void*)FileCur); } while (FileCur != FileList); /* Bottom buttons */ GfuiButtonCreate(scrHandle, "Select", GFUI_FONT_LARGE, 210, 40, 150, GFUI_ALIGN_HC_VB, GFUI_MOUSE_UP, NULL, rmSelect, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiButtonCreate(scrHandle, "Cancel", GFUI_FONT_LARGE, 430, 40, 150, GFUI_ALIGN_HC_VB, GFUI_MOUSE_UP, NULL, rmDeactivate, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); /* Default menu keyboard actions */ GfuiMenuDefaultKeysAdd(scrHandle); GfuiScreenActivate(scrHandle); }
GfTracks::GfTracks() { _pPrivate = new GfTracks::Private; // Get the list of sub-dirs in the "tracks" folder (the track categories). tFList* lstCatFolders = GfDirGetList("tracks"); if (!lstCatFolders) { GfLogFatal("No track category available in the 'tracks' folder\n"); return; } tFList* pCatFolder = lstCatFolders; do { //GfLogDebug("GfTracks::GfTracks() : Examining category %s\n", pCatFolder->name); // Ignore "." and ".." folders. const char* pszCatId = pCatFolder->name; if (pszCatId[0] == '.') continue; // Get the list of sub-dirs in the "tracks" folder (the track categories). std::string strDirName("tracks/"); strDirName += pszCatId; tFList* lstTrackFolders = GfDirGetList(strDirName.c_str()); if (!lstTrackFolders) { GfLogWarning("No track available in the '%s' folder\n", strDirName.c_str()); continue; } // Add new category. _pPrivate->vecCatIds.push_back(pszCatId); // Look at the tracks in this category. tFList* pTrackFolder = lstTrackFolders; do { //GfLogDebug("GfTracks::GfTracks() : Examining track %s\n", pTrackFolder->name); // Determine and check the XML file of the track. const char* pszTrackId = pTrackFolder->name; std::ostringstream ossFileName; ossFileName << "tracks/" << pszCatId << '/' << pszTrackId << '/' << pszTrackId << '.' << TRKEXT; const std::string strTrackFileName(ossFileName.str()); if (!GfFileExists(strTrackFileName.c_str())) { GfLogInfo("Ignoring track %s : %s not found\n", pszTrackId, strTrackFileName.c_str()); continue; } // Get 1st level track info (those which don't need to open any file). ossFileName.str(""); ossFileName << "tracks/" << pszCatId << '/' << pszTrackId << '/' << pszTrackId << ".jpg"; std::string strPreviewFileName(ossFileName.str()); if (!GfFileExists(strPreviewFileName.c_str())) { ossFileName.str(""); ossFileName << "tracks/" << pszCatId << '/' << pszTrackId << '/' << pszTrackId << ".png"; strPreviewFileName = ossFileName.str(); } if (!GfFileExists(strPreviewFileName.c_str())) strPreviewFileName = "data/img/splash-trackselect.jpg"; ossFileName.str(""); ossFileName << "tracks/" << pszCatId << '/' << pszTrackId << '/' << "outline.png"; std::string strOutlineFileName(ossFileName.str()); if (!GfFileExists(strOutlineFileName.c_str())) strOutlineFileName = "data/img/notrackoutline.png"; // Store track info in the GfTrack structure. GfTrack* pTrack = new GfTrack; pTrack->setId(pszTrackId); pTrack->setCategoryId(pszCatId); pTrack->setDescriptorFile(strTrackFileName); pTrack->setPreviewFile(strPreviewFileName); pTrack->setOutlineFile(strOutlineFileName); // Update the GfTracks singleton. _pPrivate->vecTracks.push_back(pTrack); _pPrivate->mapTracksById[pszTrackId] = pTrack; } while ((pTrackFolder = pTrackFolder->next) != lstTrackFolders); GfDirFreeList(lstTrackFolders, NULL, true, true); } while ((pCatFolder = pCatFolder->next) != lstCatFolders); GfDirFreeList(lstCatFolders, NULL, true, true); // Sort the car category ids and driver types vectors. std::sort(_pPrivate->vecCatIds.begin(), _pPrivate->vecCatIds.end()); // Trace what we got. print(false); // No verbose here, otherwise infinite recursion. }
/** Interactive track selection @param vs Pointer on a tRmTrackSelect structure (cast to void *) @warning The race manager's parameters are updated but not saved. @ingroup racemantools */ void RmTrackSelect(void *vs) { const char *defaultTrack; const char *defaultCategory; tFList *CatCur; tFList *TrList, *TrCur; int Xpos, Ypos, DX, DY; int curTrkIdx; const int BUFSIZE = 1024; char buf[BUFSIZE]; char path[BUFSIZE]; ts = (tRmTrackSelect*)vs; /* Get the list of categories directories */ CategoryList = GfDirGetList("tracks"); if (CategoryList == NULL) { GfTrace("RmTrackSelect: No track category available\n"); return; } CatCur = CategoryList; do { CatCur->dispName = RmGetCategoryName(CatCur->name); if (strlen(CatCur->dispName) == 0) { GfTrace("RmTrackSelect: No definition for track category %s\n", CatCur->name); return; } /* get the tracks in the category directory */ snprintf(buf, BUFSIZE, "tracks/%s", CatCur->name); TrList = GfDirGetList(buf); if (TrList == NULL) { GfTrace("RmTrackSelect: No track for category %s available\n", CatCur->name); return; } TrList = TrList->next; /* get the first one */ CatCur->userData = (void*)TrList; TrCur = TrList; do { TrCur->dispName = RmGetTrackName(CatCur->name, TrCur->name); if (strlen(TrCur->dispName) == 0) { GfTrace("RmTrackSelect: No definition for track %s\n", TrCur->name); return; } TrCur = TrCur->next; } while (TrCur != TrList); CatCur = CatCur->next; } while (CatCur != CategoryList); curTrkIdx = (int)GfParmGetNum(ts->param, RM_SECT_TRACKS, RE_ATTR_CUR_TRACK, NULL, 1); snprintf(path, BUFSIZE, "%s/%d", RM_SECT_TRACKS, curTrkIdx); defaultCategory = GfParmGetStr(ts->param, path, RM_ATTR_CATEGORY, CategoryList->name); /* XXX coherency check */ defaultTrack = GfParmGetStr(ts->param, path, RM_ATTR_NAME, ((tFList*)CategoryList->userData)->name); CatCur = CategoryList; do { if (strcmp(CatCur->name, defaultCategory) == 0) { CategoryList = CatCur; TrCur = (tFList*)(CatCur->userData); do { if (strcmp(TrCur->name, defaultTrack) == 0) { CatCur->userData = (void*)TrCur; break; } TrCur = TrCur->next; } while (TrCur != TrList); break; } CatCur = CatCur->next; } while (CatCur != CategoryList); scrHandle = GfuiScreenCreateEx((float*)NULL, NULL, rmtsActivate, NULL, (tfuiCallback)NULL, 1); GfuiScreenAddBgImg(scrHandle, "data/img/splash-qrtrk.png"); rmtsAddKeys(); GfuiTitleCreate(scrHandle, "Select Track", 0); GfuiGrButtonCreate(scrHandle, "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left-pushed.png", 80, 400, GFUI_ALIGN_HC_VB, 0, (void*)0, rmCatPrevNext, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); CatLabelId = GfuiLabelCreate(scrHandle, CategoryList->dispName, GFUI_FONT_LARGE_C, 320, 400, GFUI_ALIGN_HC_VB, 30); GfuiGrButtonCreate(scrHandle, "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right-pushed.png", 540, 400, GFUI_ALIGN_HC_VB, 0, (void*)1, rmCatPrevNext, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiGrButtonCreate(scrHandle, "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left.png", "data/img/arrow-left-pushed.png", 80, 370, GFUI_ALIGN_HC_VB, 0, (void*)0, rmtsPrevNext, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); TrackLabelId = GfuiLabelCreate(scrHandle, ((tFList*)CategoryList->userData)->dispName, GFUI_FONT_LARGE_C, 320, 370, GFUI_ALIGN_HC_VB, 30); GfuiGrButtonCreate(scrHandle, "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right.png", "data/img/arrow-right-pushed.png", 540, 370, GFUI_ALIGN_HC_VB, 0, (void*)1, rmtsPrevNext, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); MapId = GfuiStaticImageCreate(scrHandle, 320, 100, 260, 195, rmGetMapName(buf, BUFSIZE)); GfuiButtonCreate(scrHandle, "Accept", GFUI_FONT_LARGE, 210, 40, 150, GFUI_ALIGN_HC_VB, GFUI_MOUSE_UP, NULL, rmtsSelect, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiButtonCreate(scrHandle, "Back", GFUI_FONT_LARGE, 430, 40, 150, GFUI_ALIGN_HC_VB, GFUI_MOUSE_UP, ts->prevScreen, rmtsDeactivate, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); Xpos = 20; Ypos = 320; DX = 110; DY = 30; GfuiLabelCreate(scrHandle, "Description:", GFUI_FONT_MEDIUM, Xpos, Ypos, GFUI_ALIGN_HL_VB, 0); DescId = GfuiLabelCreate(scrHandle, "", GFUI_FONT_MEDIUM_C, Xpos + DX, Ypos, GFUI_ALIGN_HL_VB, 50); Ypos -= DY; GfuiLabelCreate(scrHandle, "Author:", GFUI_FONT_MEDIUM, Xpos, Ypos, GFUI_ALIGN_HL_VB, 0); AuthorId = GfuiLabelCreate(scrHandle, "", GFUI_FONT_MEDIUM_C, Xpos + DX, Ypos, GFUI_ALIGN_HL_VB, 20); Ypos -= DY; GfuiLabelCreate(scrHandle, "Length:", GFUI_FONT_MEDIUM, Xpos, Ypos, GFUI_ALIGN_HL_VB, 0); LengthId = GfuiLabelCreate(scrHandle, "", GFUI_FONT_MEDIUM_C, Xpos + DX, Ypos, GFUI_ALIGN_HL_VB, 20); Ypos -= DY; GfuiLabelCreate(scrHandle, "Width:", GFUI_FONT_MEDIUM, Xpos, Ypos, GFUI_ALIGN_HL_VB, 0); WidthId = GfuiLabelCreate(scrHandle, "", GFUI_FONT_MEDIUM_C, Xpos + DX, Ypos, GFUI_ALIGN_HL_VB, 20); Ypos -= DY; GfuiLabelCreate(scrHandle, "Pits:", GFUI_FONT_MEDIUM, Xpos, Ypos, GFUI_ALIGN_HL_VB, 0); PitsId = GfuiLabelCreate(scrHandle, "", GFUI_FONT_MEDIUM_C, Xpos + DX, Ypos, GFUI_ALIGN_HL_VB, 20); rmUpdateTrackInfo(); GfuiScreenActivate(scrHandle); }