Advertisement
PIBogdanov

cycling through files

Feb 14th, 2023
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <string>
  4. #include <vector>
  5. #include <thread>
  6. #include <chrono>
  7.  
  8. using namespace std;
  9.  
  10. int filesInFolderCount(string fileType)
  11. {
  12.     int fileCount = 0;
  13.  
  14.     string folderPath = "maps/" + fileType + "/";
  15.  
  16.     // Get the first file in the folder
  17.     WIN32_FIND_DATAA findFileData;
  18.  
  19.     HANDLE hFind = FindFirstFileA((folderPath + "*").c_str(), &findFileData);
  20.  
  21.     // Iterate through the files in the folder
  22.     if (hFind != INVALID_HANDLE_VALUE)
  23.     {
  24.         while (true)
  25.         {
  26.             // Check if the current file is a regular file
  27.             if ( (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0 )
  28.             {
  29.                 fileCount++;
  30.             }
  31.  
  32.             if ( !(FindNextFileA(hFind, &findFileData)) )
  33.             {
  34.                 break;
  35.             }
  36.         }
  37.  
  38.         // Clean up
  39.         FindClose(hFind);
  40.     }
  41.  
  42.     return fileCount;
  43. }
  44.  
  45. int main()
  46. {
  47.     int fileCount = filesInFolderCount("custom");
  48.  
  49.     string* menu = new string[fileCount]; // NOTE: To work with a dynamic array the second if statement in the while loop, that's located in a if statement is needed
  50.  
  51.     //vector<string> menu(fileCount); // NOTE: Works perfectly
  52.  
  53.     WIN32_FIND_DATA findData;
  54.     HANDLE hFind;
  55.  
  56.     string folderPath = "maps/custom/";
  57.  
  58.     wstring wideFolderPath(folderPath.begin(), folderPath.end());
  59.     wideFolderPath += L"*";
  60.  
  61.     hFind = FindFirstFile(wideFolderPath.c_str(), &findData);
  62.  
  63.     if (hFind != INVALID_HANDLE_VALUE)
  64.     {
  65.         char narrowStr[MAX_PATH];
  66.  
  67.         int counter = 0;
  68.  
  69.         while (FindNextFile(hFind, &findData) != 0)
  70.         {
  71.             WideCharToMultiByte(CP_ACP, 0, findData.cFileName, -1, narrowStr, MAX_PATH, NULL, NULL);
  72.  
  73.             if (strcmp(narrowStr, ".") != 0 && strcmp(narrowStr, "..") != 0)
  74.             {
  75.                 if (counter == fileCount)
  76.                 {
  77.                     fileCount *= 2;
  78.  
  79.                     string* newData = new string[fileCount];
  80.  
  81.                     for (int i = 0; i < counter; i++)
  82.                     {
  83.                         newData[i] = menu[i];
  84.                     }
  85.  
  86.                     menu = newData;
  87.  
  88.                     delete[] newData;
  89.  
  90.                     newData = menu;
  91.                 }
  92.  
  93.                 menu[counter] = narrowStr;
  94.  
  95.                 counter++;
  96.             }
  97.         }
  98.  
  99.         FindClose(hFind);
  100.     }
  101.  
  102.     int pointer = 0;
  103.  
  104.     bool lastUpKeyState = false;
  105.  
  106.     bool lastDownKeyState = false;
  107.  
  108.     bool lastReturnKeyState = false;
  109.  
  110.     bool arrowVisible = true;
  111.  
  112.     while (true)
  113.     {
  114.         system("cls");
  115.  
  116.         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  117.  
  118.         cout << "Select a Custom Map" << "\n" << "\n";
  119.  
  120.         for (int i = 0; i < fileCount; i++)
  121.         {
  122.             if (i == pointer)
  123.             {
  124.                 if (arrowVisible)
  125.                 {
  126.                     cout << "-> ";
  127.  
  128.                     arrowVisible = false;
  129.                 }
  130.  
  131.                 else
  132.                 {
  133.                     cout << "    "; // Prints 4 spaces to cover the previous "-> "
  134.  
  135.                     arrowVisible = true;
  136.                 }
  137.  
  138.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
  139.  
  140.                 cout << menu[i] << "\n";
  141.             }
  142.  
  143.             else
  144.             {
  145.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  146.  
  147.                 cout << menu[i] << "\n";
  148.             }
  149.         }
  150.  
  151.         bool upKeyState = GetAsyncKeyState(VK_UP);
  152.  
  153.         if ( (upKeyState) && !(lastUpKeyState) )
  154.         {
  155.             pointer -= 1;
  156.  
  157.             if (pointer == -1)
  158.             {
  159.                 pointer = fileCount - 1;
  160.             }
  161.         }
  162.  
  163.         lastUpKeyState = upKeyState;
  164.  
  165.         bool downKeyState = GetAsyncKeyState(VK_DOWN);
  166.  
  167.         if ( (downKeyState) && !(lastDownKeyState) )
  168.         {
  169.             pointer += 1;
  170.  
  171.             if (pointer == fileCount)
  172.             {
  173.                 pointer = 0;
  174.             }
  175.         }
  176.  
  177.         lastDownKeyState = downKeyState;
  178.  
  179.         bool returnKeyState = GetAsyncKeyState(VK_RETURN);
  180.  
  181.         if ( (returnKeyState) && !(lastReturnKeyState) )
  182.         {
  183.             // code to load the selected file goes here
  184.         }
  185.  
  186.         lastReturnKeyState = returnKeyState;
  187.  
  188.         this_thread::sleep_for(chrono::milliseconds(200));
  189.     }
  190.  
  191.     delete[] menu;
  192.  
  193.     return 0;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement