Advertisement
PIBogdanov

filesMenu

Feb 14th, 2023
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.55 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.                     string* newData = new string[fileCount * 2];
  78.  
  79.                     for (int i = 0; i < counter; i++)
  80.                     {
  81.                         newData[i] = menu[i];
  82.                     }
  83.  
  84.                     delete[] menu;
  85.  
  86.                     menu = newData;
  87.                 }
  88.  
  89.                 menu[counter] = narrowStr;
  90.  
  91.                 counter++;
  92.             }
  93.         }
  94.  
  95.         FindClose(hFind);
  96.     }
  97.  
  98.     int pointer = 0;
  99.  
  100.     bool lastUpKeyState = false;
  101.  
  102.     bool lastDownKeyState = false;
  103.  
  104.     bool lastReturnKeyState = false;
  105.  
  106.     bool arrowVisible = true;
  107.  
  108.     while (true)
  109.     {
  110.         system("cls");
  111.  
  112.         SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  113.  
  114.         cout << "There are " << fileCount << " files in the subfolder called \"custom\"." << "\n" << "\n";
  115.  
  116.         cout << "Select a Custom Map" << "\n" << "\n";
  117.  
  118.         for (int i = 0; i < fileCount; i++)
  119.         {
  120.             if (i == pointer)
  121.             {
  122.                 if (arrowVisible)
  123.                 {
  124.                     cout << "-> ";
  125.  
  126.                     arrowVisible = false;
  127.                 }
  128.  
  129.                 else
  130.                 {
  131.                     cout << "    "; // Prints 4 spaces to cover the previous "-> "
  132.  
  133.                     arrowVisible = true;
  134.                 }
  135.  
  136.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
  137.  
  138.                 cout << menu[i] << "\n";
  139.             }
  140.  
  141.             else
  142.             {
  143.                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  144.  
  145.                 cout << menu[i] << "\n";
  146.             }
  147.         }
  148.  
  149.         bool upKeyState = GetAsyncKeyState(VK_UP);
  150.  
  151.         if ( (upKeyState) && !(lastUpKeyState) )
  152.         {
  153.             pointer -= 1;
  154.  
  155.             if (pointer == -1)
  156.             {
  157.                 pointer = fileCount - 1;
  158.             }
  159.         }
  160.  
  161.         lastUpKeyState = upKeyState;
  162.  
  163.         bool downKeyState = GetAsyncKeyState(VK_DOWN);
  164.  
  165.         if ( (downKeyState) && !(lastDownKeyState) )
  166.         {
  167.             pointer += 1;
  168.  
  169.             if (pointer == fileCount)
  170.             {
  171.                 pointer = 0;
  172.             }
  173.         }
  174.  
  175.         lastDownKeyState = downKeyState;
  176.  
  177.         bool returnKeyState = GetAsyncKeyState(VK_RETURN);
  178.  
  179.         if ( (returnKeyState) && !(lastReturnKeyState) )
  180.         {
  181.             // code to load the selected file goes here
  182.         }
  183.  
  184.         lastReturnKeyState = returnKeyState;
  185.  
  186.         this_thread::sleep_for(chrono::milliseconds(200));
  187.     }
  188.  
  189.     delete[] menu;
  190.  
  191.     return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement