/** Searches in the given search directory for files ending with the * given extension. Then will create a window with buttons for each * found file. * \param searchDir the directory to search in * \param fileExtension the extension files should end with, if the * extension has a dot (.) then this dot _must_ be present as * the first char in this parameter * \param mode (purpose unknown) * \param numPlayers (purpose unknown) */ void addMultiRequest(const char* searchDir, const char* fileExtension, UDWORD mode, UBYTE mapCam, UBYTE numPlayers) { W_FORMINIT sFormInit; W_BUTINIT sButInit; UDWORD players; char** fileList; char** currFile; const unsigned int extensionLength = strlen(fileExtension); const unsigned int buttonsX = (mode == MULTIOP_MAP) ? 22 : 17; unsigned int numButtons, count, butPerForm, i; static char tips[NBTIPS][MAX_STR_LENGTH]; context = mode; if(mode == MULTIOP_MAP) { // only save these when they select MAP button current_tech = mapCam; current_numplayers = numPlayers; } fileList = PHYSFS_enumerateFiles(searchDir); if (!fileList) { debug(LOG_FATAL, "addMultiRequest: Out of memory"); abort(); return; } // Count number of required buttons numButtons = 0; for (currFile = fileList; *currFile != NULL; ++currFile) { const unsigned int fileNameLength = strlen(*currFile); // Check to see if this file matches the given extension if (fileNameLength > extensionLength && strcmp(&(*currFile)[fileNameLength - extensionLength], fileExtension) == 0) ++numButtons; } if(mode == MULTIOP_MAP) // if its a map, also look in the predone stuff. { char* map; if ((map = enumerateMultiMaps(&players, true, mapCam, numPlayers))) { free(map); numButtons++; while ((map = enumerateMultiMaps(&players, false, mapCam, numPlayers))) { free(map); numButtons++; } } } psRScreen = widgCreateScreen(); ///< move this to intinit or somewhere like that.. (close too.) widgSetTipFont(psRScreen,font_regular); /* Calculate how many buttons will go on a single form */ butPerForm = ((M_REQUEST_W - 0 - 4) / (R_BUT_W +4)) * ((M_REQUEST_H - 0- 4) / (R_BUT_H+ 4)); /* add a form to place the tabbed form on */ memset(&sFormInit, 0, sizeof(W_FORMINIT)); sFormInit.formID = 0; sFormInit.id = M_REQUEST; sFormInit.style = WFORM_PLAIN; sFormInit.x = (SWORD)(M_REQUEST_X+D_W); sFormInit.y = (SWORD)(M_REQUEST_Y+D_H); sFormInit.width = M_REQUEST_W; sFormInit.height = M_REQUEST_H; sFormInit.disableChildren = true; sFormInit.pDisplay = intOpenPlainForm; widgAddForm(psRScreen, &sFormInit); /* Add the tabs */ memset(&sFormInit, 0, sizeof(W_FORMINIT)); sFormInit.formID = M_REQUEST; sFormInit.id = M_REQUEST_TAB; sFormInit.style = WFORM_TABBED; sFormInit.x = 2; sFormInit.y = 2; sFormInit.width = M_REQUEST_W; sFormInit.height = M_REQUEST_H-4; sFormInit.numMajor = numForms(numButtons, butPerForm); sFormInit.majorPos = WFORM_TABTOP; sFormInit.minorPos = WFORM_TABNONE; sFormInit.majorSize = OBJ_TABWIDTH+2; sFormInit.majorOffset = OBJ_TABOFFSET; sFormInit.tabVertOffset = (OBJ_TABHEIGHT/2); sFormInit.tabMajorThickness = OBJ_TABHEIGHT; sFormInit.pUserData = &StandardTab; sFormInit.pTabDisplay = intDisplayTab; // TABFIXME: // This appears to be the map pick screen, when we have lots of maps // this will need to change. if (sFormInit.numMajor > MAX_TAB_STD_SHOWN) { ASSERT(sFormInit.numMajor < MAX_TAB_SMALL_SHOWN,"Too many maps! Need scroll tabs here."); sFormInit.pUserData = &SmallTab; sFormInit.majorSize /= 2; } for (i = 0; i < sFormInit.numMajor; ++i) { sFormInit.aNumMinors[i] = 2; } widgAddForm(psRScreen, &sFormInit); // Add the close button. memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = M_REQUEST; sButInit.id = M_REQUEST_CLOSE; sButInit.style = WBUT_PLAIN; sButInit.x = M_REQUEST_W - CLOSE_WIDTH - 3; sButInit.y = 0; sButInit.width = CLOSE_WIDTH; sButInit.height = CLOSE_HEIGHT; sButInit.pTip = _("Close"); sButInit.FontID = font_regular; sButInit.pDisplay = intDisplayImageHilight; sButInit.UserData = PACKDWORD_TRI(0,IMAGE_CLOSEHILIGHT , IMAGE_CLOSE); widgAddButton(psRScreen, &sButInit); /* Put the buttons on it *//* Set up the button struct */ memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = M_REQUEST_TAB; sButInit.id = M_REQUEST_BUT; sButInit.style = WBUT_PLAIN; sButInit.x = buttonsX; sButInit.y = 4; sButInit.width = R_BUT_W; sButInit.height = R_BUT_H; sButInit.pUserData = NULL; sButInit.pDisplay = displayRequestOption; sButInit.FontID = font_regular; for (currFile = fileList, count = 0; *currFile != NULL && count < (butPerForm * 4); ++currFile) { const unsigned int tip_index = check_tip_index(sButInit.id - M_REQUEST_BUT); const unsigned int fileNameLength = strlen(*currFile); const unsigned int tipStringLength = fileNameLength - extensionLength; // Check to see if this file matches the given extension if (!(fileNameLength > extensionLength) || strcmp(&(*currFile)[fileNameLength - extensionLength], fileExtension) != 0) continue; // Set the tip and add the button // Copy all of the filename except for the extension into the tiptext string strlcpy(tips[tip_index], *currFile, MIN(tipStringLength + 1, sizeof(tips[tip_index]))); sButInit.pTip = tips[tip_index]; sButInit.pText = tips[tip_index]; if(mode == MULTIOP_MAP) // if its a map, set player flag. { const char* mapText; unsigned int mapTextLength; sButInit.UserData = (*currFile)[0] - '0'; if( (*currFile)[1] != 'c') { continue; } // Chop off description mapText = strrchr(*currFile, '-') + 1; if (mapText - 1 == NULL) continue; mapTextLength = tipStringLength - (mapText - *currFile); strlcpy(tips[tip_index], mapText, MIN(mapTextLength + 1, sizeof(tips[tip_index]))); } ++count; widgAddButton(psRScreen, &sButInit); /* Update the init struct for the next button */ sButInit.id += 1; sButInit.x = (SWORD)(sButInit.x + (R_BUT_W+ 4)); if (sButInit.x + R_BUT_W+ 2 > M_REQUEST_W) { sButInit.x = buttonsX; sButInit.y = (SWORD)(sButInit.y +R_BUT_H + 4); } if (sButInit.y +R_BUT_H + 4 > M_REQUEST_H) { sButInit.y = 4; sButInit.majorID += 1; } } // Make sure to return memory back to PhyscisFS PHYSFS_freeList(fileList); if(mode == MULTIOP_MAP) { char* mapName; if ((mapName = enumerateMultiMaps(&players, true, mapCam, numPlayers))) { do { unsigned int tip_index = check_tip_index(sButInit.id-M_REQUEST_BUT); // add number of players to string. sstrcpy(tips[tip_index], mapName); free(mapName); sButInit.pTip = tips[tip_index]; sButInit.pText = tips[tip_index]; sButInit.UserData = players; widgAddButton(psRScreen, &sButInit); sButInit.id += 1; sButInit.x = (SWORD)(sButInit.x + (R_BUT_W+ 4)); if (sButInit.x + R_BUT_W+ 2 > M_REQUEST_W) { sButInit.x = buttonsX; sButInit.y = (SWORD)(sButInit.y +R_BUT_H + 4); } if (sButInit.y +R_BUT_H + 4 > M_REQUEST_H) { sButInit.y = 4; sButInit.majorID += 1; } } while ((mapName = enumerateMultiMaps(&players, false, mapCam, numPlayers))); } } multiRequestUp = true; // if it's map select then add the cam style buttons. if(mode == MULTIOP_MAP) { memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = M_REQUEST; sButInit.id = M_REQUEST_C1; sButInit.style = WBUT_PLAIN; sButInit.x = 4; sButInit.y = 258; sButInit.width = 17; sButInit.height = 17; sButInit.UserData = 1; sButInit.FontID = font_regular; sButInit.pTip = _("Technology level 1"); sButInit.pDisplay = displayCamTypeBut; widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_C2; sButInit.y += 22; sButInit.UserData = 2; sButInit.pTip = _("Technology level 2"); widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_C3; sButInit.y += 22; sButInit.UserData = 3; sButInit.pTip = _("Technology level 3"); widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_AP; sButInit.y = 17; sButInit.UserData = 0; sButInit.pTip = _("Any number of players"); sButInit.pDisplay = displayNumPlayersBut; widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_2P; sButInit.y += 22; sButInit.UserData = 2; sButInit.pTip = _("2 players"); widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_3P; sButInit.y += 22; sButInit.UserData = 3; sButInit.pTip = _("3 players"); widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_4P; sButInit.y += 22; sButInit.UserData = 4; sButInit.pTip = _("4 players"); widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_5P; sButInit.y += 22; sButInit.UserData = 5; sButInit.pTip = _("5 players"); widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_6P; sButInit.y += 22; sButInit.UserData = 6; sButInit.pTip = _("6 players"); widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_7P; sButInit.y += 22; sButInit.UserData = 7; sButInit.pTip = _("7 players"); widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_8P; sButInit.y += 22; sButInit.UserData = 8; sButInit.pTip = _("8 players"); widgAddButton(psRScreen, &sButInit); } }
/** Searches in the given search directory for files ending with the * given extension. Then will create a window with buttons for each * found file. * \param searchDir the directory to search in * \param fileExtension the extension files should end with, if the * extension has a dot (.) then this dot _must_ be present as * the first char in this parameter * \param mode (purpose unknown) * \param numPlayers (purpose unknown) */ void addMultiRequest(const char* searchDir, const char* fileExtension, UDWORD mode, UBYTE mapCam, UBYTE numPlayers) { const unsigned int extensionLength = strlen(fileExtension); const unsigned int buttonsX = (mode == MULTIOP_MAP) ? 22 : 17; context = mode; if(mode == MULTIOP_MAP) { // only save these when they select MAP button current_tech = mapCam; current_numplayers = numPlayers; } char **fileList = PHYSFS_enumerateFiles(searchDir); psRScreen = new W_SCREEN; ///< move this to intinit or somewhere like that.. (close too.) WIDGET *parent = psRScreen->psForm; /* add a form to place the tabbed form on */ IntFormAnimated *requestForm = new IntFormAnimated(parent); requestForm->id = M_REQUEST; requestForm->setGeometry(M_REQUEST_X + D_W, M_REQUEST_Y + D_H, M_REQUEST_W, M_REQUEST_H); // Add the button list. IntListTabWidget *requestList = new IntListTabWidget(requestForm); requestList->setChildSize(R_BUT_W, R_BUT_H); requestList->setChildSpacing(4, 4); requestList->setGeometry(2 + buttonsX, 2, M_REQUEST_W - buttonsX, M_REQUEST_H - 4); // Add the close button. W_BUTINIT sButInit; sButInit.formID = M_REQUEST; sButInit.id = M_REQUEST_CLOSE; sButInit.x = M_REQUEST_W - CLOSE_WIDTH - 3; sButInit.y = 0; sButInit.width = CLOSE_WIDTH; sButInit.height = CLOSE_HEIGHT; sButInit.pTip = _("Close"); sButInit.pDisplay = intDisplayImageHilight; sButInit.UserData = PACKDWORD_TRI(0,IMAGE_CLOSEHILIGHT , IMAGE_CLOSE); widgAddButton(psRScreen, &sButInit); // Put the buttons on it. int nextButtonId = M_REQUEST_BUT; for (char **currFile = fileList; *currFile != NULL; ++currFile) { const unsigned int fileNameLength = strlen(*currFile); // Check to see if this file matches the given extension if (fileNameLength <= extensionLength || strcmp(&(*currFile)[fileNameLength - extensionLength], fileExtension) != 0) continue; char *withoutExtension = strdup(*currFile); withoutExtension[fileNameLength - extensionLength] = '\0'; // Set the tip and add the button W_BUTTON *button = new W_BUTTON(requestList); button->id = nextButtonId; button->setTip(withoutExtension); button->setString(withoutExtension); button->displayFunction = displayRequestOption; requestList->addWidgetToLayout(button); free(withoutExtension); /* Update the init struct for the next button */ ++nextButtonId; } // Make sure to return memory back to PhyscisFS PHYSFS_freeList(fileList); multiRequestUp = true; hoverPreviewId = 0; if(mode == MULTIOP_MAP) { LEVEL_DATASET *mapData; bool first = true; while ((mapData = enumerateMultiMaps(first, mapCam, numPlayers)) != NULL) { first = false; // add number of players to string. W_BUTTON *button = new W_BUTTON(requestList); button->id = nextButtonId; button->setTip(mapData->pName); button->setString(mapData->pName); button->pUserData = mapData; button->displayFunction = displayRequestOption; requestList->addWidgetToLayout(button); ++nextButtonId; } // if it's map select then add the cam style buttons. sButInit = W_BUTINIT(); sButInit.formID = M_REQUEST; sButInit.id = M_REQUEST_C1; sButInit.x = 3; sButInit.y = 254; sButInit.width = 17; sButInit.height = 17; sButInit.UserData = 1; sButInit.pTip = _("Technology level 1"); sButInit.pDisplay = displayCamTypeBut; widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_C2; sButInit.y += 22; sButInit.UserData = 2; sButInit.pTip = _("Technology level 2"); widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_C3; sButInit.y += 22; sButInit.UserData = 3; sButInit.pTip = _("Technology level 3"); widgAddButton(psRScreen, &sButInit); sButInit.id = M_REQUEST_AP; sButInit.y = 17; sButInit.UserData = 0; sButInit.pTip = _("Any number of players"); sButInit.pDisplay = displayNumPlayersBut; widgAddButton(psRScreen, &sButInit); STATIC_ASSERT(MAX_PLAYERS_IN_GUI <= ARRAY_SIZE(M_REQUEST_NP) + 1); for (unsigned numPlayers = 2; numPlayers <= MAX_PLAYERS_IN_GUI; ++numPlayers) { static char ttip[MAX_PLAYERS_IN_GUI + 1][20]; sButInit.id = M_REQUEST_NP[numPlayers - 2]; sButInit.y += 22; sButInit.UserData = numPlayers; ssprintf(ttip[numPlayers], ngettext("%d player", "%d players", numPlayers), numPlayers); sButInit.pTip = ttip[numPlayers]; widgAddButton(psRScreen, &sButInit); } } }