From 7ad29f670dc0d21b0edc37440609a8b4c81b42b5 Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Sat, 29 Oct 2022 20:06:32 +0200 Subject: [PATCH 01/15] NW triple null eldritch horror --- main.cpp | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/main.cpp b/main.cpp index 03123db..d228b47 100644 --- a/main.cpp +++ b/main.cpp @@ -98,17 +98,22 @@ int listDirectory(std::string path, std::vector *directoryContents){ */ int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, std::vector *dest){ + static int lmao = 0; char* nextOcurrence = strchr(volumePaths, separator); - if (nextOcurrence[0] == nextOcurrence[sizeof(TCHAR)]) return 0; - + //TODO Test de cadena original + char* itemPath; itemPath = (char*)calloc(1, volumePathsBufferSize); - for (int i = 0; &volumePaths[i] == nextOcurrence; i++) { + //for (int i = 0; &volumePaths[i] == nextOcurrence; i++) { + for (int i = 0; volumePaths[i] != nextOcurrence[0]; i++) { itemPath[i] = volumePaths[i]; } dest->push_back(itemPath); - - + //TODO Test de recursividad + //if (debug) { std::cout << dest->at(0) << std::endl; exit(1); } + if (debug && lmao == 3) { std::cout << volumePaths << std::endl; exit(1); } + lmao++; + if (nextOcurrence[0] == nextOcurrence[sizeof(TCHAR)]) return 0; return explodePaths(nextOcurrence, volumePathsBufferSize, separator, dest); } @@ -116,7 +121,7 @@ int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, int listVolumes(std::vector *onPresentPaths){ //int listVolumes(){ HANDLE hFind = INVALID_HANDLE_VALUE; - char separator = '\0'; + const char separator = '\0'; int numVolumes = 0; //Volume name @@ -126,7 +131,14 @@ int listVolumes(std::vector *onPresentPaths){ int volumePathsBufferSize = (MAX_PATH + 1) * sizeof(TCHAR); unsigned long volumePathLength; TCHAR volumePaths[volumePathsBufferSize]; - + //TODO BORRAR + std::fill(volumePaths, volumePaths + volumePathsBufferSize, '4'); + for (int i = 0; i < volumePathsBufferSize; i++){ + std::cout << std::to_string(i) + ": "; + std::cout << volumePaths[i]; + std::cout << " | "; + } + std::cout << std::endl << "I IA" << std::endl; hFind = FindFirstVolume(volumeName, volumeNameSize); //if (debug) std::cout << volumeNameSize << std::endl; @@ -139,6 +151,17 @@ int listVolumes(std::vector *onPresentPaths){ if (volumePathLength == 1) { if (debug) std::cout << "Skill Issue" << std::endl; continue; } if (debug) std::cout << volumeName; if (debug) { + if (debug && volumePaths[0] == 'E') { + std::cout << volumePathLength << std::endl; + /*exit(1);*/ + for (int i = 0; i < volumePathsBufferSize; i++){ + std::cout << std::to_string(i) + ": "; + std::cout << volumePaths[i]; + std::cout << " | "; + } + std::cout << std::endl << "I IA" << std::endl; + exit(1); + } if(explodePaths(volumePaths, volumePathsBufferSize, separator, onPresentPaths)){ if (debug) std::cout << volumePaths << std::endl; for (int i = 0; i < onPresentPaths->size(); i++){ From 545e7b53d188ac53e4d541d5e48530ee8d1923af Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Sat, 29 Oct 2022 20:51:45 +0200 Subject: [PATCH 02/15] Listar volumenes en consola WE ARE THE VOLUMES --- main.cpp | 84 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 34 deletions(-) diff --git a/main.cpp b/main.cpp index d228b47..d3c7917 100644 --- a/main.cpp +++ b/main.cpp @@ -97,24 +97,47 @@ int listDirectory(std::string path, std::vector *directoryContents){ if (nextOcurrence == NULL) return 0; */ -int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, std::vector *dest){ - static int lmao = 0; +int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, std::vector *dest, int depth = 0){ + //Por alguna razon esta puta mierda que dice acabar con 2 NULL acaba con 3; de locos. + //https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumepathnamesforvolumenamew + + static int lmao = 0; char* nextOcurrence = strchr(volumePaths, separator); - //TODO Test de cadena original + //TODO Test de cadena original; + // if (debug && lmao) { + // std::cout << std::to_string(lmao) + ":lmao " << std::endl; + // for (int i = 0; i < volumePathsBufferSize; i++){ + // std::cout << std::to_string(i) + ": "; + // std::cout << volumePaths[i]; + // std::cout << " | "; + // } + // std::cout << std::endl << "I IA" << std::endl; + // exit(1); + // } + // if (debug && volumePaths[0] == 'E') lmao = 1; char* itemPath; itemPath = (char*)calloc(1, volumePathsBufferSize); //for (int i = 0; &volumePaths[i] == nextOcurrence; i++) { - for (int i = 0; volumePaths[i] != nextOcurrence[0]; i++) { - itemPath[i] = volumePaths[i]; + int pathLengthIdx = 0; + for (; volumePaths[pathLengthIdx] != nextOcurrence[0]; pathLengthIdx++) { + if (debug) { std::cout << volumePaths[0]; std::cout << " ENTERS " + std::to_string(pathLengthIdx) << std::endl; } + itemPath[pathLengthIdx] = volumePaths[pathLengthIdx]; } dest->push_back(itemPath); + if (debug) { + + std::cout << dest->at(dest->size() - 1); + std::cout << " EXPLODEPATH" << std::endl; + + } //TODO Test de recursividad //if (debug) { std::cout << dest->at(0) << std::endl; exit(1); } - if (debug && lmao == 3) { std::cout << volumePaths << std::endl; exit(1); } - lmao++; - if (nextOcurrence[0] == nextOcurrence[sizeof(TCHAR)]) return 0; - return explodePaths(nextOcurrence, volumePathsBufferSize, separator, dest); + //if (debug && lmao == 3) { std::cout << volumePaths << std::endl; exit(1); } + //lmao++; + depth++; + if (nextOcurrence[0] == nextOcurrence[1]) return depth; + return explodePaths(nextOcurrence + sizeof(TCHAR), (volumePathsBufferSize - pathLengthIdx), separator, dest); } @@ -131,17 +154,10 @@ int listVolumes(std::vector *onPresentPaths){ int volumePathsBufferSize = (MAX_PATH + 1) * sizeof(TCHAR); unsigned long volumePathLength; TCHAR volumePaths[volumePathsBufferSize]; - //TODO BORRAR - std::fill(volumePaths, volumePaths + volumePathsBufferSize, '4'); - for (int i = 0; i < volumePathsBufferSize; i++){ - std::cout << std::to_string(i) + ": "; - std::cout << volumePaths[i]; - std::cout << " | "; - } - std::cout << std::endl << "I IA" << std::endl; + //TODO necesario? di + std::fill(volumePaths, volumePaths + volumePathsBufferSize, '\0'); - hFind = FindFirstVolume(volumeName, volumeNameSize); - //if (debug) std::cout << volumeNameSize << std::endl; + hFind = FindFirstVolume(volumeName, volumeNameSize); //if (debug) std::cout << volumeNameSize << std::endl; if (INVALID_HANDLE_VALUE == hFind) return -2; do { //if (debug) std::cout << volumeName << std::endl; @@ -150,20 +166,19 @@ int listVolumes(std::vector *onPresentPaths){ if (volumePathLength == 1) { if (debug) std::cout << "Skill Issue" << std::endl; continue; } if (debug) std::cout << volumeName; - if (debug) { - if (debug && volumePaths[0] == 'E') { - std::cout << volumePathLength << std::endl; - /*exit(1);*/ - for (int i = 0; i < volumePathsBufferSize; i++){ - std::cout << std::to_string(i) + ": "; - std::cout << volumePaths[i]; - std::cout << " | "; - } - std::cout << std::endl << "I IA" << std::endl; - exit(1); - } + if (debug) { + // if (debug && volumePaths[0] == 'E') { + // std::cout << volumePathLength << std::endl; + // /*exit(1);*/ + // for (int i = 0; i < volumePathsBufferSize; i++){ + // std::cout << std::to_string(i) + ": "; + // std::cout << volumePaths[i]; + // std::cout << " | "; + // } + // std::cout << std::endl << "I IA" << std::endl; + // exit(1); + // } if(explodePaths(volumePaths, volumePathsBufferSize, separator, onPresentPaths)){ - if (debug) std::cout << volumePaths << std::endl; for (int i = 0; i < onPresentPaths->size(); i++){ std::cout << onPresentPaths->at(i) << std::endl; } @@ -178,7 +193,8 @@ int listVolumes(std::vector *onPresentPaths){ } numVolumes++; - + //TODO necesario? di CAMBIAR 4 A NUL + std::fill(volumePaths, volumePaths + volumePathsBufferSize, '4'); } while (FindNextVolume(hFind, volumeName, volumeNameSize) != 0); FindVolumeClose(hFind); @@ -309,7 +325,7 @@ int main(int, char**) static bool isListVolumesAdequate = true; if (debug && isListVolumesAdequate) { isListVolumesAdequate = false; - std::cout << isListVolumesAdequate << std::endl; + //std::cout << isListVolumesAdequate << std::endl; std::vector onPresentPaths; listVolumes(&onPresentPaths); } From 571bb45b276e52f88be112d96da043780b64731b Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Sun, 30 Oct 2022 01:44:17 +0200 Subject: [PATCH 03/15] Cambio de volumen funcional VAMOS CONIO --- main.cpp | 96 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 39 deletions(-) diff --git a/main.cpp b/main.cpp index d3c7917..aa1d885 100644 --- a/main.cpp +++ b/main.cpp @@ -42,6 +42,7 @@ bool retrieveCurrentDirectory(char** currentPath){ } bool moveDirectory(char** currentPath){ + if (debug) std::cout << *currentPath << std::endl; if(SetCurrentDirectory(*currentPath)) return true; return false; } @@ -70,7 +71,7 @@ int listDirectory(std::string path, std::vector *directoryContents){ itemPath[idx] = ffd.cFileName[idx]; idx++; } while (ffd.cFileName[idx]); - + //TODO multi info Struct if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { //strcat(itemPath, " "); } else { @@ -97,47 +98,31 @@ int listDirectory(std::string path, std::vector *directoryContents){ if (nextOcurrence == NULL) return 0; */ -int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, std::vector *dest, int depth = 0){ +int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, std::vector *dest, int depth = 1){ //Por alguna razon esta puta mierda que dice acabar con 2 NULL acaba con 3; de locos. //https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumepathnamesforvolumenamew - static int lmao = 0; char* nextOcurrence = strchr(volumePaths, separator); - //TODO Test de cadena original; - // if (debug && lmao) { - // std::cout << std::to_string(lmao) + ":lmao " << std::endl; - // for (int i = 0; i < volumePathsBufferSize; i++){ - // std::cout << std::to_string(i) + ": "; - // std::cout << volumePaths[i]; - // std::cout << " | "; - // } - // std::cout << std::endl << "I IA" << std::endl; - // exit(1); - // } - // if (debug && volumePaths[0] == 'E') lmao = 1; char* itemPath; itemPath = (char*)calloc(1, volumePathsBufferSize); - //for (int i = 0; &volumePaths[i] == nextOcurrence; i++) { + int pathLengthIdx = 0; for (; volumePaths[pathLengthIdx] != nextOcurrence[0]; pathLengthIdx++) { if (debug) { std::cout << volumePaths[0]; std::cout << " ENTERS " + std::to_string(pathLengthIdx) << std::endl; } itemPath[pathLengthIdx] = volumePaths[pathLengthIdx]; } + itemPath[pathLengthIdx + 1] = '\0'; dest->push_back(itemPath); + if (debug) { - std::cout << dest->at(dest->size() - 1); - std::cout << " EXPLODEPATH" << std::endl; - + std::cout << " EXPLODEPATH" << std::endl; } - //TODO Test de recursividad - //if (debug) { std::cout << dest->at(0) << std::endl; exit(1); } - //if (debug && lmao == 3) { std::cout << volumePaths << std::endl; exit(1); } - //lmao++; - depth++; + if (nextOcurrence[0] == nextOcurrence[1]) return depth; - return explodePaths(nextOcurrence + sizeof(TCHAR), (volumePathsBufferSize - pathLengthIdx), separator, dest); + depth++; + return explodePaths(nextOcurrence + sizeof(TCHAR), (volumePathsBufferSize - pathLengthIdx), separator, dest, depth); } @@ -167,6 +152,7 @@ int listVolumes(std::vector *onPresentPaths){ if (volumePathLength == 1) { if (debug) std::cout << "Skill Issue" << std::endl; continue; } if (debug) std::cout << volumeName; if (debug) { + //pathSchecker // if (debug && volumePaths[0] == 'E') { // std::cout << volumePathLength << std::endl; // /*exit(1);*/ @@ -178,10 +164,11 @@ int listVolumes(std::vector *onPresentPaths){ // std::cout << std::endl << "I IA" << std::endl; // exit(1); // } - if(explodePaths(volumePaths, volumePathsBufferSize, separator, onPresentPaths)){ + if(numVolumes += explodePaths(volumePaths, volumePathsBufferSize, separator, onPresentPaths)){ for (int i = 0; i < onPresentPaths->size(); i++){ std::cout << onPresentPaths->at(i) << std::endl; } + } //std::cout << volumePaths << std::endl; } @@ -192,11 +179,11 @@ int listVolumes(std::vector *onPresentPaths){ if (debug) std::cout << "cagaste" << std::endl; } - numVolumes++; //TODO necesario? di CAMBIAR 4 A NUL std::fill(volumePaths, volumePaths + volumePathsBufferSize, '4'); } while (FindNextVolume(hFind, volumeName, volumeNameSize) != 0); + if (debug) std::cout << std::to_string(onPresentPaths->size()) + " JUST BEFORE MAIN" << std::endl; FindVolumeClose(hFind); return numVolumes; } @@ -320,21 +307,28 @@ int main(int, char**) } { - ImGui::Begin("File Picker in 4K"); - //TODO test listar volumenes + ImGui::Begin("File Picker in 4K"); + static bool isListVolumesAdequate = true; + static bool isListDirectoriesAdequate = true; + //Listar UNA VEZ volumenes + + static int numVolumes; + static std::vector onPresentPaths; + if (debug && isListVolumesAdequate) { isListVolumesAdequate = false; //std::cout << isListVolumesAdequate << std::endl; - std::vector onPresentPaths; - listVolumes(&onPresentPaths); + numVolumes = listVolumes(&onPresentPaths); + if (debug) std::cout << std::to_string(numVolumes) + "<- depth MAIN size() ->" + std::to_string(onPresentPaths.size()) << std::endl; + //TODO tiyuria } - // - static bool renderListbox = true; + + //Listar UNA VEZ directorios //cursed C momento: necesario ptr en otra var para mandar a char** de firma static char currentPath[MAX_PATH]; - static char* ptr = ¤tPath[0]; + static char* currentPathPtr = ¤tPath[0]; static int currentItemIdx = -1; static std::vector displayContents; @@ -343,10 +337,10 @@ int main(int, char**) if (debug) ImGui::Text("%s primir", currentPath); - if(renderListbox) { + if(isListDirectoriesAdequate) { if (debug) std::cout << "renderiso" << std::endl; - renderListbox = false; - if(!retrieveCurrentDirectory(&ptr)) { + isListDirectoriesAdequate = false; + if(!retrieveCurrentDirectory(¤tPathPtr)) { if (debug) std::cout << "pencaste"; goto filepickerFailure; } @@ -360,9 +354,33 @@ int main(int, char**) displayContents = std::move(directoryContents); } + //It's renderin' time if(numFiles > 0){ ImGui::Text("Select a file:"); if (debug) ImGui::Text("%s %d", currentPath, currentItemIdx); + + //Y a que los VOLUMENES pinta2 pa100pre + //if (debug) std::cout << std::to_string(onPresentPaths.size()) + "<- numvols" << std::endl; + if (numVolumes > 0){ + for (int i = 0; i < onPresentPaths.size(); i++) { + if (i > 0) ImGui::SameLine(); + // if (debug) std::cout << std::to_string(i) + "<- WE IN" << std::endl; + // ImGui::PushID(i); + ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); + if(ImGui::Button(onPresentPaths.at(i))){ + moveDirectory(&onPresentPaths.at(i)); + isListDirectoriesAdequate = true; + } + ImGui::PopStyleColor(3); + + // ImGui::PopID(); + } + } + + + //DIRECTORIOS ENCONTRADOS bien pinta2 if (ImGui::BeginListBox("fpLb", ImVec2(-FLT_MIN, 25 * ImGui::GetTextLineHeightWithSpacing()))){ for (int i = 0; i < numFiles; i++) { @@ -373,9 +391,9 @@ int main(int, char**) if (isSelected) { strcat(currentPath, "\\"); strcat(currentPath, displayContents.at(i)); - moveDirectory(&ptr); + moveDirectory(¤tPathPtr); currentItemIdx = -1; - renderListbox = true; + isListDirectoriesAdequate = true; } //ImGui::SetItemDefaultFocus(); From 02c777f9689d272ed24114f2d4624e77d356cec0 Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Sun, 30 Oct 2022 03:08:19 +0100 Subject: [PATCH 04/15] W MoveUp pero random bug al entrar en carpeta --- main.cpp | 72 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/main.cpp b/main.cpp index aa1d885..08e396b 100644 --- a/main.cpp +++ b/main.cpp @@ -47,10 +47,11 @@ bool moveDirectory(char** currentPath){ return false; } -int listDirectory(std::string path, std::vector *directoryContents){ +int listDirectory(std::string path, std::vector *directoryContents, std::vector *desiredExtensions = nullptr){ HANDLE hFind = INVALID_HANDLE_VALUE; WIN32_FIND_DATA ffd; LARGE_INTEGER filesize; + bool skipDueToExtension = false; int numFiles = 0; if (path.length() > (MAX_PATH - 3)) return -1; @@ -58,6 +59,42 @@ int listDirectory(std::string path, std::vector *directoryContents){ hFind = FindFirstFile(path.c_str(), &ffd); if (INVALID_HANDLE_VALUE == hFind) return -2; do { + + //TODO laberga k momento educativo + if(!strcmp(ffd.cFileName, ".") || !strcmp(ffd.cFileName, "..")) continue; + + //Codigo pa saltarse arxibus k no estiendan + /*if(desiredExtensions != nullptr){ + TCHAR* fileExtension = strrchr(ffd.cFileName, '.'); + if (debug && fileExtension != NULL) { std::cout << fileExtension; std::cout << " <- FILTERING EXTENSION" << std::endl; } + std::cout << ffd.cFileName << std::endl; + + //TODO tabien no??? + if (fileExtension == NULL) continue; + + for (int i = 0; i < desiredExtensions->size(); i++) { + if (debug) { std::cout << std::to_string(strcmp(desiredExtensions->at(i).c_str(), fileExtension)) << std::endl; } + if (strcmp(desiredExtensions->at(i).c_str(), fileExtension)){ + skipDueToExtension = true; + } + } + }*/ + + + if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && skipDueToExtension) continue; + + //TODO multi info Struct + if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + //strcat(itemPath, " "); + } else { + + // filesize.QuadPart = ((ffd.nFileSizeHigh * (MAXDWORD+1)) + ffd.nFileSizeLow); + // char buf[16]; buf[0] = ' '; + // itoa(filesize.QuadPart, buf + 1 , 10 ); + // strcat(itemPath, buf); + } + + char* itemPath; if (directoryContents->size() <= numFiles){ itemPath = (char*)calloc(1, MAX_PATH * sizeof(WCHAR)); @@ -65,21 +102,12 @@ int listDirectory(std::string path, std::vector *directoryContents){ } else { itemPath = directoryContents->at(numFiles); } - + uint64_t idx = 0; do { itemPath[idx] = ffd.cFileName[idx]; idx++; } while (ffd.cFileName[idx]); - //TODO multi info Struct - if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - //strcat(itemPath, " "); - } else { - // filesize.QuadPart = ((ffd.nFileSizeHigh * (MAXDWORD+1)) + ffd.nFileSizeLow); - // char buf[16]; buf[0] = ' '; - // itoa(filesize.QuadPart, buf + 1 , 10 ); - // strcat(itemPath, buf); - } numFiles++; } while (FindNextFile(hFind, &ffd) != 0); @@ -89,7 +117,6 @@ int listDirectory(std::string path, std::vector *directoryContents){ /* VOLUMES */ - //new char*[CharCount * sizeof(WCHAR) /*idea, si quisiera que empezase en punto X del string coger el param opcional y crear un puntero a la posicion X del array para empezar desde ahi @@ -97,7 +124,6 @@ int listDirectory(std::string path, std::vector *directoryContents){ char separator, std::vector *dest, , int startingFrom = 0); if (nextOcurrence == NULL) return 0; */ - int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, std::vector *dest, int depth = 1){ //Por alguna razon esta puta mierda que dice acabar con 2 NULL acaba con 3; de locos. //https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumepathnamesforvolumenamew @@ -176,7 +202,7 @@ int listVolumes(std::vector *onPresentPaths){ if (debug) std::cout << "THE END" << std::endl; }else{ - if (debug) std::cout << "cagaste" << std::endl; + if (debug) std::cout << "no volumes found wtf" << std::endl; } //TODO necesario? di CAMBIAR 4 A NUL @@ -191,7 +217,6 @@ int listVolumes(std::vector *onPresentPaths){ /* FIN FILE PICKER MOMENTO */ - int main(int, char**) { // Setup window @@ -345,7 +370,9 @@ int main(int, char**) goto filepickerFailure; } // - numFiles = (listDirectory(std::string(currentPath), &directoryContents)); + //TODO ELIMINAR RESTRICCION EXE; PRUEBITA DEL SIGNIORE + static std::vector restrictToExe = { "exe" }; + numFiles = (listDirectory(std::string(currentPath), &directoryContents));//, &restrictToExe)); //std::cout << numFiles; if (numFiles < 0) { if (debug) std::cout << "pencaste 2 el repencazo"; @@ -361,10 +388,11 @@ int main(int, char**) //Y a que los VOLUMENES pinta2 pa100pre //if (debug) std::cout << std::to_string(onPresentPaths.size()) + "<- numvols" << std::endl; - if (numVolumes > 0){ + if (numVolumes > 0) { for (int i = 0; i < onPresentPaths.size(); i++) { if (i > 0) ImGui::SameLine(); // if (debug) std::cout << std::to_string(i) + "<- WE IN" << std::endl; + //TODO dabid aiuda // ImGui::PushID(i); ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); @@ -374,10 +402,18 @@ int main(int, char**) isListDirectoriesAdequate = true; } ImGui::PopStyleColor(3); - // ImGui::PopID(); } } + //Permanentes e increiblemente utilitarios botones en Cuatro K + //c pervirtio con unicode std::wstring s(L"←→↑↓"); + //TODO TREMENDA MANDING DICK + static char moveUp[2] = {'.', '.'}; + static char* moveUpPtr = &moveUp[0]; + if(ImGui::Button("Move Up")){ + moveDirectory(&moveUpPtr); + isListDirectoriesAdequate = true; + } //DIRECTORIOS ENCONTRADOS bien pinta2 From 4b7cc08f8efbff1eeaa8aac5659f3c1e9e86f140 Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Sun, 30 Oct 2022 22:04:39 +0100 Subject: [PATCH 05/15] bug arreglado dudas resueltas epico bro --- main.cpp | 80 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 28 deletions(-) diff --git a/main.cpp b/main.cpp index 08e396b..21756c4 100644 --- a/main.cpp +++ b/main.cpp @@ -5,6 +5,14 @@ #define IMGUI_IMPLEMENTATION #define GL_SILENCE_DEPRECATION +#define log_debugc(str, ...) do { if (debug) fprintf(stdout, "[DEBUG] (%s:%d): " (str) "\n", __FILE__, __LINE__, ##__VA_ARGS__); } while (0) +#define log_debugcpp(str) do { \ + if (debug) std::cout << "[DEBUG]" << "(" << __FILE__ << ":" << __LINE__ << "): " << (str) << std::endl; \ + } while (0) +#define log_directory(str) if(debugVerbosity & DEBUG_DIRECTORY) log_debugcpp((str)) +#define log_volume(str) if(debugVerbosity & DEBUG_VOLUME) log_debugcpp((str)) +#define log_extension(str) if(debugVerbosity & DEBUG_EXTENSION) log_debugcpp((str)) + #include "imgui/misc/single_file/imgui_single_file.h" #include #include @@ -25,6 +33,17 @@ static void glfw_error_callback(int error, const char* description) bool debug = true; +// int debugVerbosity = 0; +// enum enumDebugVerbosity { + // DEBUG_DIRECTORY = (1<<0), + // DEBUG_VOLUME = (1<<1), + // DEBUG_EXTENSION = (1<<2) +// }; +// debugVerbosity = DEBUG_DIRECTORY | DEBUG_EXTENSION; +// debugVerbosity &= ~DEBUG_DIRECTORY; +// if (debugVerbosity & (DEBUG_DIRECTORY | DEBUG_EXTENSION)); + + typedef struct { std::vector size; std::vector name; @@ -165,7 +184,6 @@ int listVolumes(std::vector *onPresentPaths){ int volumePathsBufferSize = (MAX_PATH + 1) * sizeof(TCHAR); unsigned long volumePathLength; TCHAR volumePaths[volumePathsBufferSize]; - //TODO necesario? di std::fill(volumePaths, volumePaths + volumePathsBufferSize, '\0'); hFind = FindFirstVolume(volumeName, volumeNameSize); //if (debug) std::cout << volumeNameSize << std::endl; @@ -177,27 +195,26 @@ int listVolumes(std::vector *onPresentPaths){ if (volumePathLength == 1) { if (debug) std::cout << "Skill Issue" << std::endl; continue; } if (debug) std::cout << volumeName; - if (debug) { - //pathSchecker - // if (debug && volumePaths[0] == 'E') { - // std::cout << volumePathLength << std::endl; - // /*exit(1);*/ - // for (int i = 0; i < volumePathsBufferSize; i++){ - // std::cout << std::to_string(i) + ": "; - // std::cout << volumePaths[i]; - // std::cout << " | "; - // } - // std::cout << std::endl << "I IA" << std::endl; - // exit(1); + + //pathSchecker + // if (debug && volumePaths[0] == 'E') { + // std::cout << volumePathLength << std::endl; + // /*exit(1);*/ + // for (int i = 0; i < volumePathsBufferSize; i++){ + // std::cout << std::to_string(i) + ": "; + // std::cout << volumePaths[i]; + // std::cout << " | "; // } - if(numVolumes += explodePaths(volumePaths, volumePathsBufferSize, separator, onPresentPaths)){ - for (int i = 0; i < onPresentPaths->size(); i++){ - std::cout << onPresentPaths->at(i) << std::endl; - } - + // std::cout << std::endl << "I IA" << std::endl; + // exit(1); + // } + if(numVolumes += explodePaths(volumePaths, volumePathsBufferSize, separator, onPresentPaths)){ + for (int i = 0; i < onPresentPaths->size(); i++){ + std::cout << onPresentPaths->at(i) << std::endl; } - //std::cout << volumePaths << std::endl; } + //std::cout << volumePaths << std::endl; + if (debug) std::cout << std::to_string(volumePathLength) + " " ; if (debug) std::cout << "THE END" << std::endl; @@ -205,8 +222,7 @@ int listVolumes(std::vector *onPresentPaths){ if (debug) std::cout << "no volumes found wtf" << std::endl; } - //TODO necesario? di CAMBIAR 4 A NUL - std::fill(volumePaths, volumePaths + volumePathsBufferSize, '4'); + std::fill(volumePaths, volumePaths + volumePathsBufferSize, '\0'); } while (FindNextVolume(hFind, volumeName, volumeNameSize) != 0); if (debug) std::cout << std::to_string(onPresentPaths->size()) + " JUST BEFORE MAIN" << std::endl; @@ -341,12 +357,11 @@ int main(int, char**) static int numVolumes; static std::vector onPresentPaths; - if (debug && isListVolumesAdequate) { + if (isListVolumesAdequate) { isListVolumesAdequate = false; //std::cout << isListVolumesAdequate << std::endl; numVolumes = listVolumes(&onPresentPaths); if (debug) std::cout << std::to_string(numVolumes) + "<- depth MAIN size() ->" + std::to_string(onPresentPaths.size()) << std::endl; - //TODO tiyuria } @@ -356,6 +371,7 @@ int main(int, char**) static char* currentPathPtr = ¤tPath[0]; static int currentItemIdx = -1; + //TODO David momento static std::vector displayContents; std::vector directoryContents; static int numFiles = 0; @@ -363,7 +379,7 @@ int main(int, char**) if (debug) ImGui::Text("%s primir", currentPath); if(isListDirectoriesAdequate) { - if (debug) std::cout << "renderiso" << std::endl; + log_debugcpp("renderiso"); isListDirectoriesAdequate = false; if(!retrieveCurrentDirectory(¤tPathPtr)) { if (debug) std::cout << "pencaste"; @@ -371,14 +387,22 @@ int main(int, char**) } // //TODO ELIMINAR RESTRICCION EXE; PRUEBITA DEL SIGNIORE - static std::vector restrictToExe = { "exe" }; + static std::vector restrictToExe{"exe", "DSDFD"}; numFiles = (listDirectory(std::string(currentPath), &directoryContents));//, &restrictToExe)); //std::cout << numFiles; if (numFiles < 0) { + ImGui::Text("Path not valid"); if (debug) std::cout << "pencaste 2 el repencazo"; goto filepickerFailure; } + if (numFiles == 0) { + if (debug) std::cout << std::to_string (numFiles) << "<- NUM FILES" << std::endl; + char empty[] = "Empty"; + numFiles++; + directoryContents.push_back(empty); + } displayContents = std::move(directoryContents); + directoryContents.clear(); } //It's renderin' time @@ -392,7 +416,6 @@ int main(int, char**) for (int i = 0; i < onPresentPaths.size(); i++) { if (i > 0) ImGui::SameLine(); // if (debug) std::cout << std::to_string(i) + "<- WE IN" << std::endl; - //TODO dabid aiuda // ImGui::PushID(i); ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); @@ -405,10 +428,11 @@ int main(int, char**) // ImGui::PopID(); } } + + //Permanentes e increiblemente utilitarios botones en Cuatro K //c pervirtio con unicode std::wstring s(L"←→↑↓"); - //TODO TREMENDA MANDING DICK - static char moveUp[2] = {'.', '.'}; + static char moveUp[] = ".."; static char* moveUpPtr = &moveUp[0]; if(ImGui::Button("Move Up")){ moveDirectory(&moveUpPtr); From c52687450e03d5f3a2d9eb9ab8812dff9f3e002e Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Mon, 31 Oct 2022 15:33:42 +0100 Subject: [PATCH 06/15] =?UTF-8?q?peque=C3=B1os=20bugixes;=20debug=20facher?= =?UTF-8?q?ito?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- main.cpp | 137 +++++++++++++++++++++++++---------------------------- 2 files changed, 68 insertions(+), 73 deletions(-) diff --git a/.gitignore b/.gitignore index fabee7f..2abc06d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *.ini -*.exe \ No newline at end of file +*.exe +*.rdbg +*.pdb \ No newline at end of file diff --git a/main.cpp b/main.cpp index 21756c4..d49334d 100644 --- a/main.cpp +++ b/main.cpp @@ -78,8 +78,6 @@ int listDirectory(std::string path, std::vector *directoryContents, std:: hFind = FindFirstFile(path.c_str(), &ffd); if (INVALID_HANDLE_VALUE == hFind) return -2; do { - - //TODO laberga k momento educativo if(!strcmp(ffd.cFileName, ".") || !strcmp(ffd.cFileName, "..")) continue; //Codigo pa saltarse arxibus k no estiendan @@ -127,6 +125,7 @@ int listDirectory(std::string path, std::vector *directoryContents, std:: itemPath[idx] = ffd.cFileName[idx]; idx++; } while (ffd.cFileName[idx]); + itemPath[idx] = '\0'; numFiles++; } while (FindNextFile(hFind, &ffd) != 0); @@ -370,10 +369,10 @@ int main(int, char**) static char currentPath[MAX_PATH]; static char* currentPathPtr = ¤tPath[0]; - static int currentItemIdx = -1; + //static int currentItemIdx = -1; //TODO David momento - static std::vector displayContents; - std::vector directoryContents; + //static std::vector displayContents; + static std::vector directoryContents; static int numFiles = 0; if (debug) ImGui::Text("%s primir", currentPath); @@ -391,82 +390,76 @@ int main(int, char**) numFiles = (listDirectory(std::string(currentPath), &directoryContents));//, &restrictToExe)); //std::cout << numFiles; if (numFiles < 0) { - ImGui::Text("Path not valid"); + //ImGui::Text("Path not valid"); if (debug) std::cout << "pencaste 2 el repencazo"; goto filepickerFailure; } - if (numFiles == 0) { - if (debug) std::cout << std::to_string (numFiles) << "<- NUM FILES" << std::endl; - char empty[] = "Empty"; - numFiles++; - directoryContents.push_back(empty); - } - displayContents = std::move(directoryContents); - directoryContents.clear(); + + //displayContents = std::move(directoryContents); + //directoryContents.clear(); } //It's renderin' time - if(numFiles > 0){ - ImGui::Text("Select a file:"); - if (debug) ImGui::Text("%s %d", currentPath, currentItemIdx); - - //Y a que los VOLUMENES pinta2 pa100pre - //if (debug) std::cout << std::to_string(onPresentPaths.size()) + "<- numvols" << std::endl; - if (numVolumes > 0) { - for (int i = 0; i < onPresentPaths.size(); i++) { - if (i > 0) ImGui::SameLine(); - // if (debug) std::cout << std::to_string(i) + "<- WE IN" << std::endl; - // ImGui::PushID(i); - ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); - if(ImGui::Button(onPresentPaths.at(i))){ - moveDirectory(&onPresentPaths.at(i)); - isListDirectoriesAdequate = true; - } - ImGui::PopStyleColor(3); - // ImGui::PopID(); + ImGui::Text("Select a file:"); + if (debug) ImGui::Text("%s ", currentPath); + + //Y a que los VOLUMENES pinta2 pa100pre + //if (debug) std::cout << std::to_string(onPresentPaths.size()) + "<- numvols" << std::endl; + if (numVolumes > 0) { + for (int i = 0; i < onPresentPaths.size(); i++) { + if (i > 0) ImGui::SameLine(); + // if (debug) std::cout << std::to_string(i) + "<- WE IN" << std::endl; + // ImGui::PushID(i); + ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); + if(ImGui::Button(onPresentPaths.at(i))){ + moveDirectory(&onPresentPaths.at(i)); + isListDirectoriesAdequate = true; } + ImGui::PopStyleColor(3); + // ImGui::PopID(); } - - - //Permanentes e increiblemente utilitarios botones en Cuatro K - //c pervirtio con unicode std::wstring s(L"←→↑↓"); - static char moveUp[] = ".."; - static char* moveUpPtr = &moveUp[0]; - if(ImGui::Button("Move Up")){ - moveDirectory(&moveUpPtr); - isListDirectoriesAdequate = true; - } - - - //DIRECTORIOS ENCONTRADOS bien pinta2 - if (ImGui::BeginListBox("fpLb", ImVec2(-FLT_MIN, 25 * ImGui::GetTextLineHeightWithSpacing()))){ - for (int i = 0; i < numFiles; i++) { - - const bool isSelected = (currentItemIdx == i); - if (ImGui::Selectable(displayContents.at(i), isSelected)) - currentItemIdx = i; - - if (isSelected) { - strcat(currentPath, "\\"); - strcat(currentPath, displayContents.at(i)); - moveDirectory(¤tPathPtr); - currentItemIdx = -1; - isListDirectoriesAdequate = true; - } - //ImGui::SetItemDefaultFocus(); - - } - ImGui::EndListBox(); - } - } else { - ImGui::Text("cagaste"); } - //ImGui::TreePop(); - filepickerFailure: - ImGui::End(); - + + + //Permanentes e increiblemente utilitarios botones en Cuatro K + //c pervirtio con unicode std::wstring s(L"←→↑↓"); + static char moveUp[] = ".."; + static char* moveUpPtr = &moveUp[0]; + if(ImGui::Button("Move Up")){ + moveDirectory(&moveUpPtr); + isListDirectoriesAdequate = true; + } + + + //DIRECTORIOS ENCONTRADOS bien pinta2 + if (ImGui::BeginListBox("fpLb", ImVec2(-FLT_MIN, 25 * ImGui::GetTextLineHeightWithSpacing()))){ + int idx = 0; + for (; idx < numFiles; idx++) { + + //const bool isSelected = (currentItemIdx == i); + bool isSelected = false; + if (ImGui::Selectable(directoryContents.at(idx), &isSelected)){ + //currentItemIdx = i; + strcat(currentPath, "\\"); + strcat(currentPath, directoryContents.at(idx)); + moveDirectory(¤tPathPtr); + //currentItemIdx = -1; + isListDirectoriesAdequate = true; + } + + //ImGui::SetItemDefaultFocus(); + + } + if (!idx) ImGui::Text("Folder is empty"); + ImGui::EndListBox(); + } + + //ImGui::TreePop(); + filepickerFailure: + ImGui::End(); + } From c51fbcd156299c85803dd3248c0aad359dac26bd Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Mon, 31 Oct 2022 17:24:20 +0100 Subject: [PATCH 07/15] implementado struct muchoinfo directory --- main.cpp | 112 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 48 deletions(-) diff --git a/main.cpp b/main.cpp index d49334d..861dda6 100644 --- a/main.cpp +++ b/main.cpp @@ -5,6 +5,7 @@ #define IMGUI_IMPLEMENTATION #define GL_SILENCE_DEPRECATION + #define log_debugc(str, ...) do { if (debug) fprintf(stdout, "[DEBUG] (%s:%d): " (str) "\n", __FILE__, __LINE__, ##__VA_ARGS__); } while (0) #define log_debugcpp(str) do { \ if (debug) std::cout << "[DEBUG]" << "(" << __FILE__ << ":" << __LINE__ << "): " << (str) << std::endl; \ @@ -13,6 +14,9 @@ #define log_volume(str) if(debugVerbosity & DEBUG_VOLUME) log_debugcpp((str)) #define log_extension(str) if(debugVerbosity & DEBUG_EXTENSION) log_debugcpp((str)) + +#define MAX_LISTDIR_PATH_LENGTH (MAX_PATH - 3) + #include "imgui/misc/single_file/imgui_single_file.h" #include #include @@ -45,9 +49,16 @@ bool debug = true; typedef struct { - std::vector size; - std::vector name; -} directoriesInfo, volumesInfo; + long long size; + //TODO yel spacsio NELLA MEMoria + TCHAR name[MAX_LISTDIR_PATH_LENGTH]; + SYSTEMTIME createTime; + SYSTEMTIME lastAccessTime; + SYSTEMTIME lastWriteTime; + bool isFile; + bool isHidden; + +} directoriesInfo; //TODO UNICORDEO /* FILE PICKER MOMENTO */ @@ -61,25 +72,25 @@ bool retrieveCurrentDirectory(char** currentPath){ } bool moveDirectory(char** currentPath){ - if (debug) std::cout << *currentPath << std::endl; + log_debugcpp(*currentPath); if(SetCurrentDirectory(*currentPath)) return true; return false; } -int listDirectory(std::string path, std::vector *directoryContents, std::vector *desiredExtensions = nullptr){ +int listDirectory(std::string path, std::vector *directoryContents, std::vector *desiredExtensions = nullptr){ HANDLE hFind = INVALID_HANDLE_VALUE; WIN32_FIND_DATA ffd; LARGE_INTEGER filesize; bool skipDueToExtension = false; int numFiles = 0; - if (path.length() > (MAX_PATH - 3)) return -1; + if (path.length() > (MAX_LISTDIR_PATH_LENGTH)) return -1; path = path + "\\*"; hFind = FindFirstFile(path.c_str(), &ffd); if (INVALID_HANDLE_VALUE == hFind) return -2; do { if(!strcmp(ffd.cFileName, ".") || !strcmp(ffd.cFileName, "..")) continue; - + log_debugcpp("BUCLE listDirectory iteracion " + std::to_string(numFiles)); //Codigo pa saltarse arxibus k no estiendan /*if(desiredExtensions != nullptr){ TCHAR* fileExtension = strrchr(ffd.cFileName, '.'); @@ -95,38 +106,45 @@ int listDirectory(std::string path, std::vector *directoryContents, std:: skipDueToExtension = true; } } - }*/ - - - if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && skipDueToExtension) continue; - - //TODO multi info Struct - if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - //strcat(itemPath, " "); - } else { - - // filesize.QuadPart = ((ffd.nFileSizeHigh * (MAXDWORD+1)) + ffd.nFileSizeLow); - // char buf[16]; buf[0] = ' '; - // itoa(filesize.QuadPart, buf + 1 , 10 ); - // strcat(itemPath, buf); } + if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && skipDueToExtension) continue;*/ - - char* itemPath; + //TODO Borrar legado + // char* itemPath; + // if (directoryContents->size() <= numFiles){ + // itemPath = (char*)calloc(1, MAX_PATH * sizeof(WCHAR)); + // directoryContents->push_back(itemPath); + // } else { + // itemPath = directoryContents->at(numFiles); + // } + directoriesInfo* itemInfo; if (directoryContents->size() <= numFiles){ - itemPath = (char*)calloc(1, MAX_PATH * sizeof(WCHAR)); - directoryContents->push_back(itemPath); + itemInfo = new directoriesInfo(); + directoryContents->push_back(itemInfo); } else { - itemPath = directoryContents->at(numFiles); + itemInfo = directoryContents->at(numFiles); } - + log_debugcpp("MEMORIA ASIGNADA iteracion " + std::to_string(numFiles)); + + //A registrar info, fiera + itemInfo->isFile = (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? true : false; + itemInfo->isHidden = (ffd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ? true : false; + //Tamaño + filesize.QuadPart = ((ffd.nFileSizeHigh * (MAXDWORD+1)) + ffd.nFileSizeLow); + itemInfo->size = filesize.QuadPart; + //Fechitssss + FileTimeToSystemTime(&ffd.ftCreationTime, &itemInfo->createTime); + FileTimeToSystemTime(&ffd.ftLastAccessTime, &itemInfo->lastAccessTime); + FileTimeToSystemTime(&ffd.ftLastWriteTime, &itemInfo->lastWriteTime); + //Nombre de la cosita uint64_t idx = 0; do { - itemPath[idx] = ffd.cFileName[idx]; + itemInfo->name[idx] = ffd.cFileName[idx]; idx++; } while (ffd.cFileName[idx]); - itemPath[idx] = '\0'; - + itemInfo->name[idx] = '\0'; + log_debugcpp("INFORMACION ALMACENADA iteracion " + std::to_string(numFiles)); + numFiles++; } while (FindNextFile(hFind, &ffd) != 0); FindClose(hFind); @@ -214,17 +232,16 @@ int listVolumes(std::vector *onPresentPaths){ } //std::cout << volumePaths << std::endl; - if (debug) std::cout << std::to_string(volumePathLength) + " " ; - if (debug) std::cout << "THE END" << std::endl; + log_debugcpp(std::to_string(volumePathLength) + "<- VOLUME PATH LENGTH"); + log_debugcpp("THE END"); }else{ - if (debug) std::cout << "no volumes found wtf" << std::endl; + log_debugcpp("no volumes found wtf"); } std::fill(volumePaths, volumePaths + volumePathsBufferSize, '\0'); } while (FindNextVolume(hFind, volumeName, volumeNameSize) != 0); - - if (debug) std::cout << std::to_string(onPresentPaths->size()) + " JUST BEFORE MAIN" << std::endl; + log_debugcpp(std::to_string(onPresentPaths->size()) + " JUST BEFORE MAIN"); FindVolumeClose(hFind); return numVolumes; } @@ -351,8 +368,8 @@ int main(int, char**) static bool isListVolumesAdequate = true; static bool isListDirectoriesAdequate = true; - //Listar UNA VEZ volumenes + //Listar UNA VEZ volumenes static int numVolumes; static std::vector onPresentPaths; @@ -360,7 +377,7 @@ int main(int, char**) isListVolumesAdequate = false; //std::cout << isListVolumesAdequate << std::endl; numVolumes = listVolumes(&onPresentPaths); - if (debug) std::cout << std::to_string(numVolumes) + "<- depth MAIN size() ->" + std::to_string(onPresentPaths.size()) << std::endl; + log_debugcpp(std::to_string(numVolumes) + "<- depth MAIN size() ->" + std::to_string(onPresentPaths.size())); } @@ -370,28 +387,27 @@ int main(int, char**) static char* currentPathPtr = ¤tPath[0]; //static int currentItemIdx = -1; - //TODO David momento - //static std::vector displayContents; - static std::vector directoryContents; + //static std::vector directoryContents; + static std::vector directoryContents; static int numFiles = 0; - if (debug) ImGui::Text("%s primir", currentPath); + ImGui::Text("%s PRE DIRECTORY TREATMENTO", currentPath); if(isListDirectoriesAdequate) { - log_debugcpp("renderiso"); + log_debugcpp("ADECUADO LISTAR DIRECTORIOS"); isListDirectoriesAdequate = false; if(!retrieveCurrentDirectory(¤tPathPtr)) { - if (debug) std::cout << "pencaste"; + log_debugcpp("NO HABIA DIRECTORIO GetCurrentPath()"); goto filepickerFailure; } // //TODO ELIMINAR RESTRICCION EXE; PRUEBITA DEL SIGNIORE - static std::vector restrictToExe{"exe", "DSDFD"}; + //static std::vector restrictToExe{"exe", "DSDFD"}; numFiles = (listDirectory(std::string(currentPath), &directoryContents));//, &restrictToExe)); //std::cout << numFiles; if (numFiles < 0) { //ImGui::Text("Path not valid"); - if (debug) std::cout << "pencaste 2 el repencazo"; + log_debugcpp("FALLO LA FUNCION, VALOR NEGATIVO"); goto filepickerFailure; } @@ -401,7 +417,7 @@ int main(int, char**) //It's renderin' time ImGui::Text("Select a file:"); - if (debug) ImGui::Text("%s ", currentPath); + if (debug) ImGui::Text("%s TEMPADDRBAR", currentPath); //Y a que los VOLUMENES pinta2 pa100pre //if (debug) std::cout << std::to_string(onPresentPaths.size()) + "<- numvols" << std::endl; @@ -440,10 +456,10 @@ int main(int, char**) //const bool isSelected = (currentItemIdx == i); bool isSelected = false; - if (ImGui::Selectable(directoryContents.at(idx), &isSelected)){ + if (ImGui::Selectable(directoryContents.at(idx)->name, &isSelected)){ //currentItemIdx = i; strcat(currentPath, "\\"); - strcat(currentPath, directoryContents.at(idx)); + strcat(currentPath, directoryContents.at(idx)->name); moveDirectory(¤tPathPtr); //currentItemIdx = -1; isListDirectoriesAdequate = true; From dbf0ebf76abfe2b6635c1ee144c1176ccbf0555b Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Tue, 1 Nov 2022 00:24:58 +0100 Subject: [PATCH 08/15] primera aproximacion a interfaz --- main.cpp | 109 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 90 insertions(+), 19 deletions(-) diff --git a/main.cpp b/main.cpp index 861dda6..7036d2e 100644 --- a/main.cpp +++ b/main.cpp @@ -448,32 +448,103 @@ int main(int, char**) isListDirectoriesAdequate = true; } - - //DIRECTORIOS ENCONTRADOS bien pinta2 - if (ImGui::BeginListBox("fpLb", ImVec2(-FLT_MIN, 25 * ImGui::GetTextLineHeightWithSpacing()))){ - int idx = 0; - for (; idx < numFiles; idx++) { + //LA GRAN TABLACIÓN: ACTOR EN LAS SOMBRAS + static ImGuiTableFlags splitterTableFlags = ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; + if (ImGui::BeginTable("##splitterTable", 2, splitterTableFlags, ImVec2(-FLT_MIN, 0.8f * ImGui::GetTextLineHeightWithSpacing()))){ + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + + //VOLUMENES + static ImGuiTableFlags volumesFlags = ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY ; + if (ImGui::BeginTable("##volumesTable", 1, volumesFlags, ImVec2(-FLT_MIN, 20 * ImGui::GetTextLineHeightWithSpacing()))){ + ImGui::TableSetupColumn("Volumes", ImGuiTableColumnFlags_NoHide); + //ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); + //ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 18.0f); + ImGui::TableHeadersRow(); + ImGui::TableNextRow(); - //const bool isSelected = (currentItemIdx == i); - bool isSelected = false; - if (ImGui::Selectable(directoryContents.at(idx)->name, &isSelected)){ - //currentItemIdx = i; - strcat(currentPath, "\\"); - strcat(currentPath, directoryContents.at(idx)->name); - moveDirectory(¤tPathPtr); - //currentItemIdx = -1; - isListDirectoriesAdequate = true; + if (numVolumes > 0) { + for (int i = 0; i < onPresentPaths.size(); i++) { + ImGui::TableNextColumn(); + //if (i > 0) ImGui::SameLine(); + // if (debug) std::cout << std::to_string(i) + "<- WE IN" << std::endl; + // ImGui::PushID(i); + ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); + if(ImGui::Button(onPresentPaths.at(i))){ + moveDirectory(&onPresentPaths.at(i)); + isListDirectoriesAdequate = true; + } + ImGui::PopStyleColor(3); + if (i != onPresentPaths.size() - 1) ImGui::TableNextRow(); + // ImGui::PopID(); + } } - - //ImGui::SetItemDefaultFocus(); - + ImGui::EndTable(); } - if (!idx) ImGui::Text("Folder is empty"); - ImGui::EndListBox(); + + ImGui::TableNextColumn(); + + + //DIRECTORIOS ENCONTRADOS bien pinta2 + static ImGuiTableFlags directoriesFlags = ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable |ImGuiTableFlags_ScrollY ; + if (ImGui::BeginTable("##directoriesTable", 3, directoriesFlags, ImVec2(-FLT_MIN, 20 * ImGui::GetTextLineHeightWithSpacing()))){ + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoHide); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_NoHide); + ImGui::TableSetupColumn("Size", ImGuiTableColumnFlags_NoHide); + //ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); + //ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 18.0f); + ImGui::TableHeadersRow(); + + int idx = 0; + for (; idx < numFiles; idx++) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + + //NAME + bool isSelected = false; + if (ImGui::Selectable(directoryContents.at(idx)->name, &isSelected)){ + //currentItemIdx = i; + strcat(currentPath, "\\"); + strcat(currentPath, directoryContents.at(idx)->name); + moveDirectory(¤tPathPtr); + //currentItemIdx = -1; + isListDirectoriesAdequate = true; + } + ImGui::TableNextColumn(); + + //TYPE + if (directoryContents.at(idx)->isFile) ImGui::Text("Folder"); else ImGui::Text("File"); + ImGui::TableNextColumn(); + + //SIZE + if (!directoryContents.at(idx)->isFile) ImGui::Text("%lld bytes", directoryContents.at(idx)->size); + else ImGui::Text(""); + + //ImGui::SetItemDefaultFocus(); + + } + if (!idx) { ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Folder is empty"); } + ImGui::EndTable(); + } + + ImGui::EndTable(); + } + + + + + + + //ImGui::TreePop(); + filepickerFailure: + + ImGui::Button("AAAAAAAAAAAAAAAAAAAAAAAAAQ" ); ImGui::End(); } From 4e5f53a3e91a94dbb2b5ec1e7f2df5ad176a9367 Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Wed, 2 Nov 2022 17:29:05 +0100 Subject: [PATCH 09/15] Boton ocultar, mas estilo --- main.cpp | 75 +++++++++++++++++++------------------------------------- 1 file changed, 25 insertions(+), 50 deletions(-) diff --git a/main.cpp b/main.cpp index 7036d2e..9e9e27e 100644 --- a/main.cpp +++ b/main.cpp @@ -109,14 +109,6 @@ int listDirectory(std::string path, std::vector *directoryCont } if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && skipDueToExtension) continue;*/ - //TODO Borrar legado - // char* itemPath; - // if (directoryContents->size() <= numFiles){ - // itemPath = (char*)calloc(1, MAX_PATH * sizeof(WCHAR)); - // directoryContents->push_back(itemPath); - // } else { - // itemPath = directoryContents->at(numFiles); - // } directoriesInfo* itemInfo; if (directoryContents->size() <= numFiles){ itemInfo = new directoriesInfo(); @@ -189,7 +181,6 @@ int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, int listVolumes(std::vector *onPresentPaths){ -//int listVolumes(){ HANDLE hFind = INVALID_HANDLE_VALUE; const char separator = '\0'; @@ -225,6 +216,7 @@ int listVolumes(std::vector *onPresentPaths){ // std::cout << std::endl << "I IA" << std::endl; // exit(1); // } + if(numVolumes += explodePaths(volumePaths, volumePathsBufferSize, separator, onPresentPaths)){ for (int i = 0; i < onPresentPaths->size(); i++){ std::cout << onPresentPaths->at(i) << std::endl; @@ -366,6 +358,7 @@ int main(int, char**) { ImGui::Begin("File Picker in 4K"); + static bool isInvalidPath = false; static bool isListVolumesAdequate = true; static bool isListDirectoriesAdequate = true; @@ -406,48 +399,29 @@ int main(int, char**) numFiles = (listDirectory(std::string(currentPath), &directoryContents));//, &restrictToExe)); //std::cout << numFiles; if (numFiles < 0) { - //ImGui::Text("Path not valid"); - log_debugcpp("FALLO LA FUNCION, VALOR NEGATIVO"); - goto filepickerFailure; + log_debugcpp("FALLO LA FUNCION, VALOR NEGATIVO " + std::to_string(numFiles)); + isInvalidPath = true; } - - //displayContents = std::move(directoryContents); - //directoryContents.clear(); } //It's renderin' time + static bool showHidden = false; ImGui::Text("Select a file:"); - if (debug) ImGui::Text("%s TEMPADDRBAR", currentPath); - //Y a que los VOLUMENES pinta2 pa100pre - //if (debug) std::cout << std::to_string(onPresentPaths.size()) + "<- numvols" << std::endl; - if (numVolumes > 0) { - for (int i = 0; i < onPresentPaths.size(); i++) { - if (i > 0) ImGui::SameLine(); - // if (debug) std::cout << std::to_string(i) + "<- WE IN" << std::endl; - // ImGui::PushID(i); - ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); - if(ImGui::Button(onPresentPaths.at(i))){ - moveDirectory(&onPresentPaths.at(i)); - isListDirectoriesAdequate = true; - } - ImGui::PopStyleColor(3); - // ImGui::PopID(); - } - } - - - //Permanentes e increiblemente utilitarios botones en Cuatro K + //Permanentes e increiblemente utilitarios botones en Cuatro K: MOVE UP //c pervirtio con unicode std::wstring s(L"←→↑↓"); static char moveUp[] = ".."; static char* moveUpPtr = &moveUp[0]; - if(ImGui::Button("Move Up")){ + if(ImGui::Button("Move Up")) { moveDirectory(&moveUpPtr); + isInvalidPath = false; isListDirectoriesAdequate = true; } + ImGui::SameLine(); + //BARRA DE DIRECCIONES + ImGui::Text("%s TEMPADDRBAR", currentPath); + //LA GRAN TABLACIÓN: ACTOR EN LAS SOMBRAS static ImGuiTableFlags splitterTableFlags = ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; if (ImGui::BeginTable("##splitterTable", 2, splitterTableFlags, ImVec2(-FLT_MIN, 0.8f * ImGui::GetTextLineHeightWithSpacing()))){ @@ -466,8 +440,6 @@ int main(int, char**) if (numVolumes > 0) { for (int i = 0; i < onPresentPaths.size(); i++) { ImGui::TableNextColumn(); - //if (i > 0) ImGui::SameLine(); - // if (debug) std::cout << std::to_string(i) + "<- WE IN" << std::endl; // ImGui::PushID(i); ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); @@ -499,6 +471,8 @@ int main(int, char**) int idx = 0; for (; idx < numFiles; idx++) { + if(directoryContents.at(idx)->isHidden && !showHidden) continue; + ImGui::TableNextRow(); ImGui::TableNextColumn(); @@ -525,26 +499,27 @@ int main(int, char**) //ImGui::SetItemDefaultFocus(); } - if (!idx) { ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Folder is empty"); } + //DISPLAYING ALTERNATIVE INFO + if (!idx) { + ImGui::TableNextRow(); ImGui::TableNextColumn(); + if (isInvalidPath) ImGui::Text("Failed to access: Path not valid"); + else ImGui::Text("Folder is empty"); + } ImGui::EndTable(); } - ImGui::EndTable(); - } - - - - - //ImGui::TreePop(); - + + ImGui::Checkbox("Show hidden", &showHidden); + ImGui::SameLine(); + ImGui::Button("Select"); filepickerFailure: - ImGui::Button("AAAAAAAAAAAAAAAAAAAAAAAAAQ" ); + ImGui::End(); } From 395159763c7eab69358b533bfcb7735bf619893a Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Wed, 2 Nov 2022 19:18:19 +0100 Subject: [PATCH 10/15] comparar final string; futuro getfiletipe? --- main.cpp | 67 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/main.cpp b/main.cpp index 9e9e27e..df12cbe 100644 --- a/main.cpp +++ b/main.cpp @@ -63,6 +63,28 @@ typedef struct { //TODO UNICORDEO /* FILE PICKER MOMENTO */ +/* PROPOSITO GENERAL */ + +bool compareLastChar(std::vector *lastCharCandidates, char* string){ + bool matchingExtension = false; + for (int i = 0; i < lastCharCandidates->size(); i++){ + log_debugcpp(lastCharCandidates->at(i) + " <- FILTERING EXTENSION"); + + if(strlen(string) < lastCharCandidates->at(i).length()) continue; + char* potentialExtension = &string[strlen(string) - lastCharCandidates->at(i).length()]; + + log_debugcpp(potentialExtension); + log_debugcpp(" LEN " + std::to_string(strlen(potentialExtension)) + " <- VS -> " + lastCharCandidates->at(i) + " LEN " + std::to_string(lastCharCandidates->at(i).length())); + //+ strlen(potentialExtension) + std::to_string(lastCharCandidates->at(i).length()) + if(!strcmp(potentialExtension, lastCharCandidates->at(i).c_str())) { + log_debugcpp("VALID EXTENSION"); + matchingExtension = true; + } + } + return matchingExtension; +} + + /* DIRECTORIES */ @@ -77,11 +99,10 @@ bool moveDirectory(char** currentPath){ return false; } -int listDirectory(std::string path, std::vector *directoryContents, std::vector *desiredExtensions = nullptr){ +int listDirectory(std::string path, std::vector *directoryContents){ HANDLE hFind = INVALID_HANDLE_VALUE; WIN32_FIND_DATA ffd; LARGE_INTEGER filesize; - bool skipDueToExtension = false; int numFiles = 0; if (path.length() > (MAX_LISTDIR_PATH_LENGTH)) return -1; @@ -91,23 +112,6 @@ int listDirectory(std::string path, std::vector *directoryCont do { if(!strcmp(ffd.cFileName, ".") || !strcmp(ffd.cFileName, "..")) continue; log_debugcpp("BUCLE listDirectory iteracion " + std::to_string(numFiles)); - //Codigo pa saltarse arxibus k no estiendan - /*if(desiredExtensions != nullptr){ - TCHAR* fileExtension = strrchr(ffd.cFileName, '.'); - if (debug && fileExtension != NULL) { std::cout << fileExtension; std::cout << " <- FILTERING EXTENSION" << std::endl; } - std::cout << ffd.cFileName << std::endl; - - //TODO tabien no??? - if (fileExtension == NULL) continue; - - for (int i = 0; i < desiredExtensions->size(); i++) { - if (debug) { std::cout << std::to_string(strcmp(desiredExtensions->at(i).c_str(), fileExtension)) << std::endl; } - if (strcmp(desiredExtensions->at(i).c_str(), fileExtension)){ - skipDueToExtension = true; - } - } - } - if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && skipDueToExtension) continue;*/ directoriesInfo* itemInfo; if (directoryContents->size() <= numFiles){ @@ -116,7 +120,7 @@ int listDirectory(std::string path, std::vector *directoryCont } else { itemInfo = directoryContents->at(numFiles); } - log_debugcpp("MEMORIA ASIGNADA iteracion " + std::to_string(numFiles)); + log_debugcpp("MEMORY ASSIGNES iteration " + std::to_string(numFiles)); //A registrar info, fiera itemInfo->isFile = (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? true : false; @@ -168,11 +172,10 @@ int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, } itemPath[pathLengthIdx + 1] = '\0'; dest->push_back(itemPath); + //TODO concat de puto C + log_debugcpp(dest->at(dest->size() - 1)); + log_debugcpp( " EXPLODEPATH"); - if (debug) { - std::cout << dest->at(dest->size() - 1); - std::cout << " EXPLODEPATH" << std::endl; - } if (nextOcurrence[0] == nextOcurrence[1]) return depth; depth++; @@ -202,7 +205,7 @@ int listVolumes(std::vector *onPresentPaths){ if(GetVolumePathNamesForVolumeName(volumeName, volumePaths, volumePathsBufferSize, &volumePathLength)){ if (volumePathLength == 1) { if (debug) std::cout << "Skill Issue" << std::endl; continue; } - if (debug) std::cout << volumeName; + log_debugcpp(volumeName); //pathSchecker // if (debug && volumePaths[0] == 'E') { @@ -395,8 +398,8 @@ int main(int, char**) } // //TODO ELIMINAR RESTRICCION EXE; PRUEBITA DEL SIGNIORE - //static std::vector restrictToExe{"exe", "DSDFD"}; - numFiles = (listDirectory(std::string(currentPath), &directoryContents));//, &restrictToExe)); + + numFiles = listDirectory(std::string(currentPath), &directoryContents); //std::cout << numFiles; if (numFiles < 0) { log_debugcpp("FALLO LA FUNCION, VALOR NEGATIVO " + std::to_string(numFiles)); @@ -406,6 +409,8 @@ int main(int, char**) //It's renderin' time static bool showHidden = false; + static bool filterByExtension = false; + static std::vector extensions; ImGui::Text("Select a file:"); //Permanentes e increiblemente utilitarios botones en Cuatro K: MOVE UP @@ -472,6 +477,12 @@ int main(int, char**) int idx = 0; for (; idx < numFiles; idx++) { if(directoryContents.at(idx)->isHidden && !showHidden) continue; + if(filterByExtension && !directoryContents.at(idx)->isFile) { + //TODO XAPUSITA + extensions.clear(); + extensions.push_back("exe"); + if (!compareLastChar(&extensions, directoryContents.at(idx)->name)) continue; + } ImGui::TableNextRow(); ImGui::TableNextColumn(); @@ -516,6 +527,8 @@ int main(int, char**) ImGui::Checkbox("Show hidden", &showHidden); ImGui::SameLine(); + ImGui::Checkbox("Filter by .exe", &filterByExtension); + ImGui::SameLine(); ImGui::Button("Select"); filepickerFailure: From a50f53dcc106b8c0e2bd50cb87cdb75e050336ef Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Thu, 3 Nov 2022 01:36:14 +0100 Subject: [PATCH 11/15] casi addrbar lista, ai bug --- main.cpp | 112 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 75 insertions(+), 37 deletions(-) diff --git a/main.cpp b/main.cpp index df12cbe..97ee972 100644 --- a/main.cpp +++ b/main.cpp @@ -16,6 +16,7 @@ #define MAX_LISTDIR_PATH_LENGTH (MAX_PATH - 3) +#define MAX_ERRORSTR_LEN 512 #include "imgui/misc/single_file/imgui_single_file.h" #include @@ -63,27 +64,6 @@ typedef struct { //TODO UNICORDEO /* FILE PICKER MOMENTO */ -/* PROPOSITO GENERAL */ - -bool compareLastChar(std::vector *lastCharCandidates, char* string){ - bool matchingExtension = false; - for (int i = 0; i < lastCharCandidates->size(); i++){ - log_debugcpp(lastCharCandidates->at(i) + " <- FILTERING EXTENSION"); - - if(strlen(string) < lastCharCandidates->at(i).length()) continue; - char* potentialExtension = &string[strlen(string) - lastCharCandidates->at(i).length()]; - - log_debugcpp(potentialExtension); - log_debugcpp(" LEN " + std::to_string(strlen(potentialExtension)) + " <- VS -> " + lastCharCandidates->at(i) + " LEN " + std::to_string(lastCharCandidates->at(i).length())); - //+ strlen(potentialExtension) + std::to_string(lastCharCandidates->at(i).length()) - if(!strcmp(potentialExtension, lastCharCandidates->at(i).c_str())) { - log_debugcpp("VALID EXTENSION"); - matchingExtension = true; - } - } - return matchingExtension; -} - /* DIRECTORIES */ @@ -239,7 +219,37 @@ int listVolumes(std::vector *onPresentPaths){ log_debugcpp(std::to_string(onPresentPaths->size()) + " JUST BEFORE MAIN"); FindVolumeClose(hFind); return numVolumes; -} +} + + +/* DISPLAY */ + + +bool compareLastChar(std::vector *lastCharCandidates, char* string){ + bool matchingExtension = false; + for (int i = 0; i < lastCharCandidates->size(); i++){ + log_debugcpp(lastCharCandidates->at(i) + " <- FILTERING EXTENSION"); + + if(strlen(string) < lastCharCandidates->at(i).length()) continue; + char* potentialExtension = &string[strlen(string) - lastCharCandidates->at(i).length()]; + + log_debugcpp(potentialExtension); + log_debugcpp(" LEN " + std::to_string(strlen(potentialExtension)) + " <- VS -> " + lastCharCandidates->at(i) + " LEN " + std::to_string(lastCharCandidates->at(i).length())); + //+ strlen(potentialExtension) + std::to_string(lastCharCandidates->at(i).length()) + if(!strcmp(potentialExtension, lastCharCandidates->at(i).c_str())) { + log_debugcpp("VALID EXTENSION"); + matchingExtension = true; + } + } + return matchingExtension; +} + +bool inputMove(bool* error, char** str){ + *error = false; + if(!moveDirectory(str)) { *error = true; return false; } + return true; +} + /* FIN FILE PICKER MOMENTO */ @@ -361,9 +371,10 @@ int main(int, char**) { ImGui::Begin("File Picker in 4K"); - static bool isInvalidPath = false; + static bool showError = false; static bool isListVolumesAdequate = true; static bool isListDirectoriesAdequate = true; + static char error[MAX_ERRORSTR_LEN]; //Listar UNA VEZ volumenes static int numVolumes; @@ -381,13 +392,15 @@ int main(int, char**) //cursed C momento: necesario ptr en otra var para mandar a char** de firma static char currentPath[MAX_PATH]; static char* currentPathPtr = ¤tPath[0]; - + static char addrBarVal[MAX_LISTDIR_PATH_LENGTH]; + static char* addrBarValPtr = &addrBarVal[0]; + //static int currentItemIdx = -1; //static std::vector directoryContents; static std::vector directoryContents; static int numFiles = 0; - ImGui::Text("%s PRE DIRECTORY TREATMENTO", currentPath); + //ImGui::Text("%s PRE DIRECTORY TREATMENTO", currentPath); if(isListDirectoriesAdequate) { log_debugcpp("ADECUADO LISTAR DIRECTORIOS"); @@ -403,7 +416,13 @@ int main(int, char**) //std::cout << numFiles; if (numFiles < 0) { log_debugcpp("FALLO LA FUNCION, VALOR NEGATIVO " + std::to_string(numFiles)); - isInvalidPath = true; + showError = true; + strcpy(error, "Failed to open folder: permission denied?"); + strcpy(currentPath, addrBarVal); + numFiles = listDirectory(std::string(currentPath), &directoryContents); + } else { + showError = false; + strcpy(addrBarVal, currentPath); } } @@ -411,6 +430,11 @@ int main(int, char**) static bool showHidden = false; static bool filterByExtension = false; static std::vector extensions; + + if(showError){ + ImGui::Text(error); + } + ImGui::Text("Select a file:"); //Permanentes e increiblemente utilitarios botones en Cuatro K: MOVE UP @@ -418,14 +442,31 @@ int main(int, char**) static char moveUp[] = ".."; static char* moveUpPtr = &moveUp[0]; if(ImGui::Button("Move Up")) { - moveDirectory(&moveUpPtr); - isInvalidPath = false; - isListDirectoriesAdequate = true; + isListDirectoriesAdequate = inputMove(&showError, (&moveUpPtr)); + strcpy(error, "Failed to move up: reached volume root?"); } ImGui::SameLine(); //BARRA DE DIRECCIONES - ImGui::Text("%s TEMPADDRBAR", currentPath); + if(ImGui::InputText("##addrbar", addrBarVal, IM_ARRAYSIZE(addrBarVal), ImGuiInputTextFlags_EnterReturnsTrue )){ + log_debugcpp(currentPath); + log_debugcpp(" ADDRBAR INTENTO"); + isListDirectoriesAdequate = inputMove(&showError, &addrBarValPtr); + if (isListDirectoriesAdequate) strcpy(currentPath, addrBarVal); + else strcpy(addrBarVal, currentPath); + strcpy(error, "Failed to open folder: invalid path"); + }; + ImGui::SameLine(); + if(ImGui::Button("Enter")){ + log_debugcpp(currentPath); + log_debugcpp(" ADDRBAR INTENTO"); + isListDirectoriesAdequate = inputMove(&showError, &addrBarValPtr); + if (isListDirectoriesAdequate) strcpy(currentPath, addrBarVal); + else strcpy(addrBarVal, currentPath); + strcpy(error, "Failed to open folder: invalid path"); + } + + //ImGui::Text("%s TEMPADDRBAR", currentPath); //LA GRAN TABLACIÓN: ACTOR EN LAS SOMBRAS static ImGuiTableFlags splitterTableFlags = ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; @@ -450,8 +491,7 @@ int main(int, char**) ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); if(ImGui::Button(onPresentPaths.at(i))){ - moveDirectory(&onPresentPaths.at(i)); - isListDirectoriesAdequate = true; + isListDirectoriesAdequate = inputMove(&showError, &onPresentPaths.at(i)); } ImGui::PopStyleColor(3); if (i != onPresentPaths.size() - 1) ImGui::TableNextRow(); @@ -493,9 +533,9 @@ int main(int, char**) //currentItemIdx = i; strcat(currentPath, "\\"); strcat(currentPath, directoryContents.at(idx)->name); - moveDirectory(¤tPathPtr); + isListDirectoriesAdequate = inputMove(&showError, ¤tPathPtr); + strcpy(error, "Failed to open folder: invalid option"); //currentItemIdx = -1; - isListDirectoriesAdequate = true; } ImGui::TableNextColumn(); @@ -512,9 +552,7 @@ int main(int, char**) } //DISPLAYING ALTERNATIVE INFO if (!idx) { - ImGui::TableNextRow(); ImGui::TableNextColumn(); - if (isInvalidPath) ImGui::Text("Failed to access: Path not valid"); - else ImGui::Text("Folder is empty"); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Folder is empty"); } ImGui::EndTable(); } From 027400d763d8a5e1c5fc1a30c1b855ec8d647922 Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Thu, 3 Nov 2022 17:19:57 +0100 Subject: [PATCH 12/15] rip bug, mjr errstr hndl: string? adminright msg? --- main.cpp | 67 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/main.cpp b/main.cpp index 97ee972..8d94996 100644 --- a/main.cpp +++ b/main.cpp @@ -8,7 +8,7 @@ #define log_debugc(str, ...) do { if (debug) fprintf(stdout, "[DEBUG] (%s:%d): " (str) "\n", __FILE__, __LINE__, ##__VA_ARGS__); } while (0) #define log_debugcpp(str) do { \ - if (debug) std::cout << "[DEBUG]" << "(" << __FILE__ << ":" << __LINE__ << "): " << (str) << std::endl; \ + if (debug) std::cout << "[DEBUG]" << "(" << __FILE__ << ":" << __LINE__ << "): " << str << std::endl; \ } while (0) #define log_directory(str) if(debugVerbosity & DEBUG_DIRECTORY) log_debugcpp((str)) #define log_volume(str) if(debugVerbosity & DEBUG_VOLUME) log_debugcpp((str)) @@ -61,6 +61,20 @@ typedef struct { } directoriesInfo; +struct ErrorMessages{ + const std::string addrBarError = "Failed to open folder: invalid path"; + const std::string tableElementError = "Failed to open folder: access restricted to non-admin users"; + const std::string listDirectoryError = "Failed to open folder: access denied"; + const std::string moveUpError = "Failed to move up: reached volume root?"; +}; + +// struct ErrorMessages{ + // static constexpr char addrBarError[] = "Failed to open folder: invalid path"; + // static constexpr char tableElementError[] = "Failed to open folder: access restricted to non-admin users"; + // static constexpr char listDirectoryError[] = "Failed to open folder: access denied"; + // static constexpr char moveUpError[] = "Failed to move up: reached volume root?"; +// }; + //TODO UNICORDEO /* FILE PICKER MOMENTO */ @@ -153,9 +167,7 @@ int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, itemPath[pathLengthIdx + 1] = '\0'; dest->push_back(itemPath); //TODO concat de puto C - log_debugcpp(dest->at(dest->size() - 1)); - log_debugcpp( " EXPLODEPATH"); - + log_debugcpp(dest->at(dest->size() - 1) << " EXPLODEPATH"); if (nextOcurrence[0] == nextOcurrence[1]) return depth; depth++; @@ -177,10 +189,9 @@ int listVolumes(std::vector *onPresentPaths){ TCHAR volumePaths[volumePathsBufferSize]; std::fill(volumePaths, volumePaths + volumePathsBufferSize, '\0'); - hFind = FindFirstVolume(volumeName, volumeNameSize); //if (debug) std::cout << volumeNameSize << std::endl; + hFind = FindFirstVolume(volumeName, volumeNameSize); if (INVALID_HANDLE_VALUE == hFind) return -2; do { - //if (debug) std::cout << volumeName << std::endl; if(GetVolumePathNamesForVolumeName(volumeName, volumePaths, volumePathsBufferSize, &volumePathLength)){ @@ -233,8 +244,7 @@ bool compareLastChar(std::vector *lastCharCandidates, char* string) if(strlen(string) < lastCharCandidates->at(i).length()) continue; char* potentialExtension = &string[strlen(string) - lastCharCandidates->at(i).length()]; - log_debugcpp(potentialExtension); - log_debugcpp(" LEN " + std::to_string(strlen(potentialExtension)) + " <- VS -> " + lastCharCandidates->at(i) + " LEN " + std::to_string(lastCharCandidates->at(i).length())); + log_debugcpp(potentialExtension << " LEN " + std::to_string(strlen(potentialExtension)) + " <- VS -> " + lastCharCandidates->at(i) + " LEN " + std::to_string(lastCharCandidates->at(i).length())); //+ strlen(potentialExtension) + std::to_string(lastCharCandidates->at(i).length()) if(!strcmp(potentialExtension, lastCharCandidates->at(i).c_str())) { log_debugcpp("VALID EXTENSION"); @@ -250,6 +260,12 @@ bool inputMove(bool* error, char** str){ return true; } +void handleFolderAccessResult(bool isListDirectoriesAdequate, char* currentPath, char* addrBarVal, char* errorDest, const char* errorContent){ + if (isListDirectoriesAdequate) strcpy(currentPath, addrBarVal); + else strcpy(addrBarVal, currentPath); + strcpy(errorDest, errorContent); +} + /* FIN FILE PICKER MOMENTO */ @@ -372,9 +388,10 @@ int main(int, char**) ImGui::Begin("File Picker in 4K"); static bool showError = false; + static char error[MAX_ERRORSTR_LEN]; + static ErrorMessages eMsg; static bool isListVolumesAdequate = true; static bool isListDirectoriesAdequate = true; - static char error[MAX_ERRORSTR_LEN]; //Listar UNA VEZ volumenes static int numVolumes; @@ -417,7 +434,7 @@ int main(int, char**) if (numFiles < 0) { log_debugcpp("FALLO LA FUNCION, VALOR NEGATIVO " + std::to_string(numFiles)); showError = true; - strcpy(error, "Failed to open folder: permission denied?"); + strcpy(error, eMsg.listDirectoryError.c_str()); strcpy(currentPath, addrBarVal); numFiles = listDirectory(std::string(currentPath), &directoryContents); } else { @@ -443,31 +460,26 @@ int main(int, char**) static char* moveUpPtr = &moveUp[0]; if(ImGui::Button("Move Up")) { isListDirectoriesAdequate = inputMove(&showError, (&moveUpPtr)); - strcpy(error, "Failed to move up: reached volume root?"); + strcpy(error, eMsg.moveUpError.c_str()); } ImGui::SameLine(); //BARRA DE DIRECCIONES + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize("Enter").x + ImGui::GetStyle().ItemSpacing.x * 2) ); if(ImGui::InputText("##addrbar", addrBarVal, IM_ARRAYSIZE(addrBarVal), ImGuiInputTextFlags_EnterReturnsTrue )){ - log_debugcpp(currentPath); - log_debugcpp(" ADDRBAR INTENTO"); + log_debugcpp(currentPath <<" ADDRBAR INTENTO"); isListDirectoriesAdequate = inputMove(&showError, &addrBarValPtr); - if (isListDirectoriesAdequate) strcpy(currentPath, addrBarVal); - else strcpy(addrBarVal, currentPath); - strcpy(error, "Failed to open folder: invalid path"); + handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, eMsg.addrBarError.c_str()); }; + ImGui::PopItemWidth(); ImGui::SameLine(); if(ImGui::Button("Enter")){ - log_debugcpp(currentPath); - log_debugcpp(" ADDRBAR INTENTO"); + log_debugcpp(currentPath <<" ADDRBAR INTENTO"); isListDirectoriesAdequate = inputMove(&showError, &addrBarValPtr); - if (isListDirectoriesAdequate) strcpy(currentPath, addrBarVal); - else strcpy(addrBarVal, currentPath); - strcpy(error, "Failed to open folder: invalid path"); + handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, eMsg.addrBarError.c_str()); } - //ImGui::Text("%s TEMPADDRBAR", currentPath); - + log_debugcpp(currentPath <<" LEMISIIMIA"); //LA GRAN TABLACIÓN: ACTOR EN LAS SOMBRAS static ImGuiTableFlags splitterTableFlags = ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; if (ImGui::BeginTable("##splitterTable", 2, splitterTableFlags, ImVec2(-FLT_MIN, 0.8f * ImGui::GetTextLineHeightWithSpacing()))){ @@ -530,11 +542,10 @@ int main(int, char**) //NAME bool isSelected = false; if (ImGui::Selectable(directoryContents.at(idx)->name, &isSelected)){ - //currentItemIdx = i; - strcat(currentPath, "\\"); - strcat(currentPath, directoryContents.at(idx)->name); - isListDirectoriesAdequate = inputMove(&showError, ¤tPathPtr); - strcpy(error, "Failed to open folder: invalid option"); + strcat(addrBarVal, "\\"); + strcat(addrBarVal, directoryContents.at(idx)->name); + isListDirectoriesAdequate = inputMove(&showError, &addrBarValPtr); + handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, eMsg.tableElementError.c_str()); //currentItemIdx = -1; } ImGui::TableNextColumn(); From 8eea8336ee1d331c954adbc35ed57177ec283d10 Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Sun, 6 Nov 2022 22:58:45 +0100 Subject: [PATCH 13/15] impl historial y adminrigh error --- main.cpp | 194 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 164 insertions(+), 30 deletions(-) diff --git a/main.cpp b/main.cpp index 8d94996..5f6314b 100644 --- a/main.cpp +++ b/main.cpp @@ -6,6 +6,7 @@ #define IMGUI_IMPLEMENTATION #define GL_SILENCE_DEPRECATION +//DEBUG MACRO #define log_debugc(str, ...) do { if (debug) fprintf(stdout, "[DEBUG] (%s:%d): " (str) "\n", __FILE__, __LINE__, ##__VA_ARGS__); } while (0) #define log_debugcpp(str) do { \ if (debug) std::cout << "[DEBUG]" << "(" << __FILE__ << ":" << __LINE__ << "): " << str << std::endl; \ @@ -14,10 +15,14 @@ #define log_volume(str) if(debugVerbosity & DEBUG_VOLUME) log_debugcpp((str)) #define log_extension(str) if(debugVerbosity & DEBUG_EXTENSION) log_debugcpp((str)) - +//PATH MACRO #define MAX_LISTDIR_PATH_LENGTH (MAX_PATH - 3) #define MAX_ERRORSTR_LEN 512 +//HISTORY HANDLING MACRO +#define MIN_HISTORY_POS history->historyTraversalPos <= 0 +#define MAX_HISTORY_POS history->historyTraversalPos >= history->historyDepth + #include "imgui/misc/single_file/imgui_single_file.h" #include #include @@ -61,20 +66,49 @@ typedef struct { } directoriesInfo; -struct ErrorMessages{ - const std::string addrBarError = "Failed to open folder: invalid path"; - const std::string tableElementError = "Failed to open folder: access restricted to non-admin users"; - const std::string listDirectoryError = "Failed to open folder: access denied"; - const std::string moveUpError = "Failed to move up: reached volume root?"; +struct History{ + std::vector previousPaths; + //TODO C++ david momento + //int historyDepth = -1; + int historyDepth; + int historyTraversalPos; + bool isAdditionTime; + + History(){ + historyTraversalPos = historyDepth = -1; + isAdditionTime = true; + } +}; + +enum HistoryMovement { + HISTORY_FORWARD = 1, + HISTORY_BACKWARD = 0 +}; + +enum ListDirectoryError { + DIRECTORY_ERROR_PATH_TOO_LONG = -1, + DIRECTORY_ERROR_ACCESSING_CONTENT = -2 +}; + +enum agnosticDirError { + AGDIR_ERROR_ACCESS_DENIED = 1 }; // struct ErrorMessages{ - // static constexpr char addrBarError[] = "Failed to open folder: invalid path"; - // static constexpr char tableElementError[] = "Failed to open folder: access restricted to non-admin users"; - // static constexpr char listDirectoryError[] = "Failed to open folder: access denied"; - // static constexpr char moveUpError[] = "Failed to move up: reached volume root?"; + // const std::string addrBarError = "Failed to open folder: invalid path"; + // const std::string tableElementError = "Failed to open folder: access restricted to non-admin users"; + // const std::string listDirectoryError = "Failed to open folder: access denied"; + // const std::string moveUpError = "Failed to move up: reached volume root?"; // }; +namespace ErrorMessages { + char addrBarError[] = "Failed to open folder: invalid path"; + char tableElementError[] = "Failed to open folder: access restricted to non-admin users"; + char accessDeniedError[] = "Failed to open folder: access denied"; + char listDirectoryError[] = "Failed to open folder: unknown error"; + char moveUpError[] = "Failed to move up: reached volume root?"; +}; + //TODO UNICORDEO /* FILE PICKER MOMENTO */ @@ -99,10 +133,10 @@ int listDirectory(std::string path, std::vector *directoryCont LARGE_INTEGER filesize; int numFiles = 0; - if (path.length() > (MAX_LISTDIR_PATH_LENGTH)) return -1; + if (path.length() > (MAX_LISTDIR_PATH_LENGTH)) return DIRECTORY_ERROR_PATH_TOO_LONG; path = path + "\\*"; hFind = FindFirstFile(path.c_str(), &ffd); - if (INVALID_HANDLE_VALUE == hFind) return -2; + if (INVALID_HANDLE_VALUE == hFind) return DIRECTORY_ERROR_ACCESSING_CONTENT; do { if(!strcmp(ffd.cFileName, ".") || !strcmp(ffd.cFileName, "..")) continue; log_debugcpp("BUCLE listDirectory iteracion " + std::to_string(numFiles)); @@ -141,6 +175,18 @@ int listDirectory(std::string path, std::vector *directoryCont return numFiles; } +long getLastDirectorySystemError(){ + long winLastError = GetLastError(); + switch(winLastError){ + case ERROR_ACCESS_DENIED: + return AGDIR_ERROR_ACCESS_DENIED; + break; + default: + return -1; + break; + } +} + /* VOLUMES */ //new char*[CharCount * sizeof(WCHAR) @@ -166,7 +212,7 @@ int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, } itemPath[pathLengthIdx + 1] = '\0'; dest->push_back(itemPath); - //TODO concat de puto C + log_debugcpp(dest->at(dest->size() - 1) << " EXPLODEPATH"); if (nextOcurrence[0] == nextOcurrence[1]) return depth; @@ -198,7 +244,7 @@ int listVolumes(std::vector *onPresentPaths){ if (volumePathLength == 1) { if (debug) std::cout << "Skill Issue" << std::endl; continue; } log_debugcpp(volumeName); - //pathSchecker + //DEBUG: pathSchecker // if (debug && volumePaths[0] == 'E') { // std::cout << volumePathLength << std::endl; // /*exit(1);*/ @@ -260,18 +306,54 @@ bool inputMove(bool* error, char** str){ return true; } -void handleFolderAccessResult(bool isListDirectoriesAdequate, char* currentPath, char* addrBarVal, char* errorDest, const char* errorContent){ - if (isListDirectoriesAdequate) strcpy(currentPath, addrBarVal); +void handleFolderAccessResult(bool isListDirectoriesAdequate, char* currentPath, \ + char* addrBarVal, char* errorDest, const char* errorContent, History* history){ + if (isListDirectoriesAdequate) { strcpy(currentPath, addrBarVal); history->isAdditionTime = true; } else strcpy(addrBarVal, currentPath); strcpy(errorDest, errorContent); } +/* HISTORIAL */ + +void addPathToHistory(History *history, char* pathToAdd){ + char* path; + int ajjj = history->previousPaths.size(); + if (history->historyTraversalPos + 1 >= ajjj){ + path = (char*)calloc(1, MAX_PATH); + history->previousPaths.push_back(path); + } else { + path = history->previousPaths.at(history->historyTraversalPos + 1); + } + strncpy(path, pathToAdd, MAX_PATH); + history->historyTraversalPos++; + history->historyDepth = history->historyTraversalPos; + history->isAdditionTime = false; +} + +char** moveThroughHistory(History *history, HistoryMovement movement){ + switch(movement){ + case HISTORY_BACKWARD: + if(MIN_HISTORY_POS) + return &history->previousPaths.at(history->historyTraversalPos); + history->historyTraversalPos--; + return &history->previousPaths.at(history->historyTraversalPos); + break; + case HISTORY_FORWARD: + if(MAX_HISTORY_POS) + return &history->previousPaths.at(history->historyDepth); + history->historyTraversalPos++; + return &history->previousPaths.at(history->historyTraversalPos); + break; + default: + return &history->previousPaths.at(history->historyDepth); + } +} + /* FIN FILE PICKER MOMENTO */ -int main(int, char**) -{ +int main(int, char**) { // Setup window glfwSetErrorCallback(glfw_error_callback); if (!glfwInit()) @@ -387,9 +469,10 @@ int main(int, char**) { ImGui::Begin("File Picker in 4K"); + //TODO is dis bector in hipp? + static History* history = new History(); static bool showError = false; static char error[MAX_ERRORSTR_LEN]; - static ErrorMessages eMsg; static bool isListVolumesAdequate = true; static bool isListDirectoriesAdequate = true; @@ -432,18 +515,46 @@ int main(int, char**) numFiles = listDirectory(std::string(currentPath), &directoryContents); //std::cout << numFiles; if (numFiles < 0) { + //TODO quitar GetLastError() de aqui + long directoryErrorCode; log_debugcpp("FALLO LA FUNCION, VALOR NEGATIVO " + std::to_string(numFiles)); + if (numFiles == DIRECTORY_ERROR_ACCESSING_CONTENT) directoryErrorCode = getLastDirectorySystemError(); showError = true; - strcpy(error, eMsg.listDirectoryError.c_str()); - strcpy(currentPath, addrBarVal); - numFiles = listDirectory(std::string(currentPath), &directoryContents); + switch(directoryErrorCode) { + case AGDIR_ERROR_ACCESS_DENIED: + strcpy(error, ErrorMessages::accessDeniedError); + strcpy(addrBarVal, history->previousPaths.at(history->historyTraversalPos)); + strcpy(currentPath, history->previousPaths.at(history->historyTraversalPos)); + numFiles = listDirectory(history->previousPaths.at(history->historyTraversalPos), &directoryContents); + break; + default: + strcpy(error, ErrorMessages::listDirectoryError); + strcpy(currentPath, addrBarVal); + numFiles = listDirectory(std::string(currentPath), &directoryContents); + history->isAdditionTime = false; + break; + } + history->isAdditionTime = false; } else { showError = false; strcpy(addrBarVal, currentPath); + if(history->isAdditionTime) addPathToHistory(history, addrBarVal); } } - //It's renderin' time + /* + + + + + + It's renderin' time + + + + + + */ static bool showHidden = false; static bool filterByExtension = false; static std::vector extensions; @@ -451,35 +562,57 @@ int main(int, char**) if(showError){ ImGui::Text(error); } - + ImGui::Text("Select a file:"); - //Permanentes e increiblemente utilitarios botones en Cuatro K: MOVE UP + //Permanentes e increiblemente utilitarios botones en Cuatro K: BACK + ImGui::BeginDisabled(MIN_HISTORY_POS); + if(ImGui::Button("Back")) { + char** interfaceMovementButtonsPath = moveThroughHistory(history, HISTORY_BACKWARD); + isListDirectoriesAdequate = inputMove(&showError, interfaceMovementButtonsPath); + //TODO: ERROR + strcpy(error, ErrorMessages::moveUpError); + } + ImGui::EndDisabled(); + //FORWARD + ImGui::SameLine(); + ImGui::BeginDisabled(MAX_HISTORY_POS); + if(ImGui::Button("Forward")) { + char** interfaceMovementButtonsPath = moveThroughHistory(history, HISTORY_FORWARD); + isListDirectoriesAdequate = inputMove(&showError, interfaceMovementButtonsPath); + strcpy(error, ErrorMessages::moveUpError); + } + ImGui::EndDisabled(); + + //MOVE UP + ImGui::SameLine(); //c pervirtio con unicode std::wstring s(L"←→↑↓"); static char moveUp[] = ".."; static char* moveUpPtr = &moveUp[0]; if(ImGui::Button("Move Up")) { isListDirectoriesAdequate = inputMove(&showError, (&moveUpPtr)); - strcpy(error, eMsg.moveUpError.c_str()); + strcpy(error, ErrorMessages::moveUpError); + history->isAdditionTime = true; } ImGui::SameLine(); //BARRA DE DIRECCIONES + //TODO a point ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize("Enter").x + ImGui::GetStyle().ItemSpacing.x * 2) ); if(ImGui::InputText("##addrbar", addrBarVal, IM_ARRAYSIZE(addrBarVal), ImGuiInputTextFlags_EnterReturnsTrue )){ log_debugcpp(currentPath <<" ADDRBAR INTENTO"); isListDirectoriesAdequate = inputMove(&showError, &addrBarValPtr); - handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, eMsg.addrBarError.c_str()); + handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, ErrorMessages::addrBarError, history); }; ImGui::PopItemWidth(); ImGui::SameLine(); if(ImGui::Button("Enter")){ log_debugcpp(currentPath <<" ADDRBAR INTENTO"); isListDirectoriesAdequate = inputMove(&showError, &addrBarValPtr); - handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, eMsg.addrBarError.c_str()); + handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, ErrorMessages::addrBarError, history); } //ImGui::Text("%s TEMPADDRBAR", currentPath); - log_debugcpp(currentPath <<" LEMISIIMIA"); + //LA GRAN TABLACIÓN: ACTOR EN LAS SOMBRAS static ImGuiTableFlags splitterTableFlags = ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; if (ImGui::BeginTable("##splitterTable", 2, splitterTableFlags, ImVec2(-FLT_MIN, 0.8f * ImGui::GetTextLineHeightWithSpacing()))){ @@ -504,6 +637,7 @@ int main(int, char**) ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); if(ImGui::Button(onPresentPaths.at(i))){ isListDirectoriesAdequate = inputMove(&showError, &onPresentPaths.at(i)); + history->isAdditionTime = true; } ImGui::PopStyleColor(3); if (i != onPresentPaths.size() - 1) ImGui::TableNextRow(); @@ -545,7 +679,7 @@ int main(int, char**) strcat(addrBarVal, "\\"); strcat(addrBarVal, directoryContents.at(idx)->name); isListDirectoriesAdequate = inputMove(&showError, &addrBarValPtr); - handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, eMsg.tableElementError.c_str()); + handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, ErrorMessages::tableElementError, history); //currentItemIdx = -1; } ImGui::TableNextColumn(); From abd315f40cf7ac29b333101fbe52f3ff49731776 Mon Sep 17 00:00:00 2001 From: OugonNoHane Date: Wed, 9 Nov 2022 18:29:31 +0100 Subject: [PATCH 14/15] arregos y qol menores --- main.cpp | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/main.cpp b/main.cpp index 5f6314b..5f92786 100644 --- a/main.cpp +++ b/main.cpp @@ -20,8 +20,8 @@ #define MAX_ERRORSTR_LEN 512 //HISTORY HANDLING MACRO -#define MIN_HISTORY_POS history->historyTraversalPos <= 0 -#define MAX_HISTORY_POS history->historyTraversalPos >= history->historyDepth +#define MIN_HISTORY_POS (history->historyTraversalPos <= 0) +#define MAX_HISTORY_POS (history->historyTraversalPos >= history->historyDepth) #include "imgui/misc/single_file/imgui_single_file.h" #include @@ -66,10 +66,13 @@ typedef struct { } directoriesInfo; + struct History{ std::vector previousPaths; - //TODO C++ david momento + //warnings e 1 cosa //int historyDepth = -1; + //TODO Limitar historial + //const int maxHistoryDepth = 10000; int historyDepth; int historyTraversalPos; bool isAdditionTime; @@ -94,13 +97,6 @@ enum agnosticDirError { AGDIR_ERROR_ACCESS_DENIED = 1 }; -// struct ErrorMessages{ - // const std::string addrBarError = "Failed to open folder: invalid path"; - // const std::string tableElementError = "Failed to open folder: access restricted to non-admin users"; - // const std::string listDirectoryError = "Failed to open folder: access denied"; - // const std::string moveUpError = "Failed to move up: reached volume root?"; -// }; - namespace ErrorMessages { char addrBarError[] = "Failed to open folder: invalid path"; char tableElementError[] = "Failed to open folder: access restricted to non-admin users"; @@ -270,7 +266,7 @@ int listVolumes(std::vector *onPresentPaths){ }else{ log_debugcpp("no volumes found wtf"); } - + //TODO benchimarqui std::fill(volumePaths, volumePaths + volumePathsBufferSize, '\0'); } while (FindNextVolume(hFind, volumeName, volumeNameSize) != 0); log_debugcpp(std::to_string(onPresentPaths->size()) + " JUST BEFORE MAIN"); @@ -317,8 +313,8 @@ void handleFolderAccessResult(bool isListDirectoriesAdequate, char* currentPath, void addPathToHistory(History *history, char* pathToAdd){ char* path; - int ajjj = history->previousPaths.size(); - if (history->historyTraversalPos + 1 >= ajjj){ + //int ajjj = history->previousPaths.size(); + if (history->historyTraversalPos + 1 >= history->previousPaths.size()){ path = (char*)calloc(1, MAX_PATH); history->previousPaths.push_back(path); } else { @@ -330,23 +326,22 @@ void addPathToHistory(History *history, char* pathToAdd){ history->isAdditionTime = false; } -char** moveThroughHistory(History *history, HistoryMovement movement){ +char** moveThroughHistory(History *history, HistoryMovement movement) { + int sign = (movement == HISTORY_BACKWARD ? -1 : 1); switch(movement){ case HISTORY_BACKWARD: if(MIN_HISTORY_POS) return &history->previousPaths.at(history->historyTraversalPos); - history->historyTraversalPos--; - return &history->previousPaths.at(history->historyTraversalPos); break; case HISTORY_FORWARD: if(MAX_HISTORY_POS) return &history->previousPaths.at(history->historyDepth); - history->historyTraversalPos++; - return &history->previousPaths.at(history->historyTraversalPos); break; default: return &history->previousPaths.at(history->historyDepth); } + history->historyTraversalPos += sign; + return &history->previousPaths.at(history->historyTraversalPos); } @@ -469,7 +464,6 @@ int main(int, char**) { { ImGui::Begin("File Picker in 4K"); - //TODO is dis bector in hipp? static History* history = new History(); static bool showError = false; static char error[MAX_ERRORSTR_LEN]; @@ -487,7 +481,6 @@ int main(int, char**) { log_debugcpp(std::to_string(numVolumes) + "<- depth MAIN size() ->" + std::to_string(onPresentPaths.size())); } - //Listar UNA VEZ directorios //cursed C momento: necesario ptr en otra var para mandar a char** de firma static char currentPath[MAX_PATH]; @@ -531,7 +524,6 @@ int main(int, char**) { strcpy(error, ErrorMessages::listDirectoryError); strcpy(currentPath, addrBarVal); numFiles = listDirectory(std::string(currentPath), &directoryContents); - history->isAdditionTime = false; break; } history->isAdditionTime = false; @@ -597,7 +589,6 @@ int main(int, char**) { ImGui::SameLine(); //BARRA DE DIRECCIONES - //TODO a point ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize("Enter").x + ImGui::GetStyle().ItemSpacing.x * 2) ); if(ImGui::InputText("##addrbar", addrBarVal, IM_ARRAYSIZE(addrBarVal), ImGuiInputTextFlags_EnterReturnsTrue )){ log_debugcpp(currentPath <<" ADDRBAR INTENTO"); From 34f6f9bbdf7591540b5ab779afaccf644d1d56f4 Mon Sep 17 00:00:00 2001 From: Hane Date: Tue, 16 Jan 2024 18:29:33 +0100 Subject: [PATCH 15/15] filepicker_independiente squash merge --- README.md | 69 ++++ demo/main.cpp | 143 ++++++++ demo/unityBuild.h | 16 + filepicker.hpp | 819 ++++++++++++++++++++++++++++++++++++++++++++++ main.cpp | 758 ------------------------------------------ 5 files changed, 1047 insertions(+), 758 deletions(-) create mode 100644 README.md create mode 100644 demo/main.cpp create mode 100644 demo/unityBuild.h create mode 100644 filepicker.hpp delete mode 100644 main.cpp diff --git a/README.md b/README.md new file mode 100644 index 0000000..a158a3d --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +Single-header file picker library for ImGui. + +Currently, this library is Windows-only. Support for Linux is planned. + +# How to use + + This library exposes three functions: + +``` +void renderFilePicker(char* userPath, bool* windowOpen, bool* memoryFreed, int windowFlags); +``` + + Call this function within the render loop providing a pre-allocated buffer of MAX_PATH characters in `userPath`, which will be filled with a UTF-8 string. `windowOpen` must be initially set to `true`, and will set itself to `false` when execution is done. If succesful, your buffer will contain a valid path. `memoryFreed` will be set to `true`, and must be checked once the window is closed to free memory resources acquired by this library. You can provide `windowFlags` to customize its appearance. + +### Window customization flags +``` + fp::WindowFlags::FULLSCREEN : Render window in full screen, without decorations. +``` + +``` +void freeMemory(bool* memoryFreed); +``` + + Memory resources will be deallocated alongside miscellaneous internal tasks, and `memoryFreed` will be set to `true`. + +``` +void setDebugInfo(int debugVerbosity); +``` + + When `FPDEBUG` is enabled, this allows you to configure debug granularity. + +### Debug flags + +``` + fp::DebugVerbosity::DIRECTORY + fp::DebugVerbosity::VOLUME + fp::DebugVerbosity::EXTENSION +``` + +# Library dependencies + + - **C++ STL**: This library uses `vector`, `fill` and `w\string`. + +# Demo build instructions + +## Build requirements + + - [**GLFW v3**](https://github.com/glfw/glfw/releases): used as rendering backend. Executable in releases is compiled with version [`3.3.9`](https://github.com/glfw/glfw/releases/tag/3.3.9). + - Developed and tested with `clang` using [**llvm-mingw 20220906**](https://github.com/mstorsjo/llvm-mingw/releases/tag/20220906). Any `MinGW`-backed `clang` compiler should work, but your mileage may vary. + +## How to compile + + Download GLFW and pick your libraries according to your toolchain. Then, call your compiler directly specifying both libs needed and your paths to the necessary header and lib files: + + ``` + clang++ demo/main.cpp -o demo/demo.exe -L C:/pathtollvmmingw/x86_64-w64-mingw32/bin -I C:\pathtollvmmingw\include -L C:/pathtoglfw/lib-mingw-w64 -I C:\pathtoglfw\include -lglfw3 -l libc++ + ``` + + If you want to statically link: + + ``` + clang++ demo/main.cpp -o demo/demo.exe -L C:/pathtoglfw/lib-mingw-w64 -L C:/pathtollvmmingw/x86_64-w64-mingw32/lib -I C:\pathtollvmmingw\include -I C:\pathtoglfw\include -std=c++17 -stdlib=libc++ -rtlib=compiler-rt -static -l glfw3 -l gdi32 -l opengl32 -l user32 -l kernel32 -static-libstdc++ + ``` + +# To-Dos + + - Implement a file watcher to check for changes on the current directory. + - Add Linux support. + - Allow users to provide their own memory allocations as an option. diff --git a/demo/main.cpp b/demo/main.cpp new file mode 100644 index 0000000..19be71e --- /dev/null +++ b/demo/main.cpp @@ -0,0 +1,143 @@ +//Demo executable based on GLFW +#define IMGUI_IMPLEMENTATION +#define GL_SILENCE_DEPRECATION + +#include "unityBuild.h" +#include "../filepicker.hpp" + +static void glfw_error_callback(int error, const char* description) { + fprintf(stderr, "Glfw Error %d: %s\n", error, description); +} + +int main(int, char**) { + // Setup window + glfwSetErrorCallback(glfw_error_callback); + if (!glfwInit()) + return 1; + + // Decide GL+GLSL versions +#if defined(IMGUI_IMPL_OPENGL_ES2) + // GL ES 2.0 + GLSL 100 + const char* glsl_version = "#version 100"; + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); +#elif defined(__APPLE__) + // GL 3.2 + GLSL 150 + const char* glsl_version = "#version 150"; + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac +#else + // GL 3.0 + GLSL 130 + const char* glsl_version = "#version 130"; + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only + //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 3.0+ only +#endif + + // Create window with graphics context + GLFWwindow* window = glfwCreateWindow(1280, 720, "File Picker Demo", NULL, NULL); + if (window == NULL) + return 1; + glfwMakeContextCurrent(window); + glfwSwapInterval(1); // Enable vsync + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplGlfw_InitForOpenGL(window, true); + ImGui_ImplOpenGL3_Init(glsl_version); + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // + bool debugDirectory = true; + bool debugVolume = true; + bool debugExtension = true; + bool debugLogic = true; + + // Our state + char path[MAX_PATH * 4] = "";// = malloc(MAX_PATH * sizeof(char)); + int debugVerbosity = fp::DebugVerbosity::DIRECTORY | fp::DebugVerbosity::VOLUME | fp::DebugVerbosity::EXTENSION | fp::DebugVerbosity::LOGIC; + bool windowOpen = true; + bool memoryFreed = true; + + // Main loop + while (!glfwWindowShouldClose(window)) { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + glfwPollEvents(); + + // Start the Dear ImGui frame + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + + fp::setDebugInfo(debugVerbosity); + if(windowOpen) + fp::renderFilePicker(&path[0], &windowOpen, &memoryFreed, 0); + else if(!memoryFreed) + fp::freeResources(&memoryFreed); + + //if (show_demo_window) + ImGui::SetNextWindowSize(ImVec2(500.0f, 500.0f)); + ImGui::Begin("Values", NULL, 0); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PopStyleVar(1); + ImGui::Text(path); + // debugVerbosity = DEBUG_DIRECTORY | DEBUG_EXTENSION; +// debugVerbosity &= ~DEBUG_DIRECTORY; +// if (debugVerbosity & (DEBUG_DIRECTORY | DEBUG_EXTENSION)); + ImGui::Text("Debug verbosity"); + ImGui::Checkbox("Directory" , &debugDirectory); + ImGui::Checkbox("Volume" , &debugVolume ); + ImGui::Checkbox("Extension" , &debugExtension); + ImGui::Checkbox("Logic" , &debugLogic ); + debugVerbosity = (debugDirectory) ? debugVerbosity | fp::DIRECTORY : debugVerbosity& ~fp::DIRECTORY; + debugVerbosity = (debugVolume) ? debugVerbosity | fp::VOLUME : debugVerbosity& ~fp::VOLUME; + debugVerbosity = (debugExtension) ? debugVerbosity | fp::EXTENSION : debugVerbosity& ~fp::EXTENSION; + debugVerbosity = (debugLogic) ? debugVerbosity | fp::LOGIC : debugVerbosity& ~fp::LOGIC; + + //fp::DebugVerbosity::DIRECTORY | fp::DebugVerbosity::VOLUME | fp::DebugVerbosity::EXTENSION | fp::DebugVerbosity::LOGIC; + if (!windowOpen) + if(ImGui::Button("Open file picker")) { + windowOpen = !windowOpen; + } + //ImGui::Text(std::to_string(state).c_str()); + //ImGui::Text(state); + ImGui::End(); + //ImGui::ShowDemoWindow(&show_demo_window); + + // Rendering + ImGui::Render(); + int display_w, display_h; + glfwGetFramebufferSize(window, &display_w, &display_h); + glViewport(0, 0, display_w, display_h); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + ImGui::EndFrame(); + glfwSwapBuffers(window); + } + + // Cleanup + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + + glfwDestroyWindow(window); + glfwTerminate(); + + return 0; +} diff --git a/demo/unityBuild.h b/demo/unityBuild.h new file mode 100644 index 0000000..d2a675a --- /dev/null +++ b/demo/unityBuild.h @@ -0,0 +1,16 @@ +#define WIN32_LEAN_AND_MEAN +#define UNICODE +#define _UNICODE +#include "../imgui/imgui.h" + +#ifdef IMGUI_IMPLEMENTATION +#include "../imgui/imgui.cpp" +#include "../imgui/imgui_demo.cpp" +#include "../imgui/imgui_draw.cpp" +#include "../imgui/imgui_tables.cpp" +#include "../imgui/imgui_widgets.cpp" +#include "../imgui/backends/imgui_impl_glfw.h" +#include "../imgui/backends/imgui_impl_opengl3.h" +#include "../imgui/backends/imgui_impl_opengl3.cpp" +#include "../imgui/backends/imgui_impl_glfw.cpp" +#endif diff --git a/filepicker.hpp b/filepicker.hpp new file mode 100644 index 0000000..9b6dbc5 --- /dev/null +++ b/filepicker.hpp @@ -0,0 +1,819 @@ +//DEBUG MACRO +#ifdef FPDEBUG +#define log_debugc(str, ...) do { if (debug) fprintf(stdout, "[DEBUG] (%s:%d): " (str) "\n", __FILE__, __LINE__, ##__VA_ARGS__); } while (0) +#define log_debugcpp(str) do { \ + if (debug) std::cout << "[DEBUG]" << "(" << __FILE__ << ":" << __LINE__ << "): " << str << std::endl; \ + } while (0) +#define log_wdebugcpp(str) do { \ + if (debug) std::wcout << "[DEBUG]" << "(" << __FILE__ << ":" << __LINE__ << "): " << str << std::endl; \ + } while (0) +#define log_directory(str) do { \ + if(debugVerbosity & DIRECTORY) log_debugcpp(str); \ + } while (0) +#define log_volume(str) do { \ + if(debugVerbosity & VOLUME) log_debugcpp(str); \ + } while (0) +#define log_logic(str) do { \ + if(debugVerbosity & LOGIC) log_debugcpp(str); \ + } while (0) +#define log_extension(str) do { \ + if(debugVerbosity & EXTENSION) log_debugcpp(str); \ + } while (0) +#define log_wdirectory(str) do { \ + if(debugVerbosity & DIRECTORY) log_wdebugcpp(str); \ + } while (0) +#define log_wvolume(str) do { \ + if(debugVerbosity & VOLUME) log_wdebugcpp(str); \ + } while (0) +#define log_wextension(str) do { \ + if(debugVerbosity & EXTENSION) log_wdebugcpp(str); \ + } while (0) +#define log_wlogic(str) do { \ + if(debugVerbosity & LOGIC) log_wdebugcpp(str); \ + } while (0) +#else +#define log_debugc(str, ...) +#define log_debugcpp(str) +#define log_wdebugcpp(str) +#define log_directory(str) +#define log_volume(str) +#define log_extension(str) +#define log_wdirectory(str) +#define log_wvolume(str) +#define log_wextension(str) +#define log_logic(str) +#define log_wlogic(str) +#endif + +//PATH MACRO +#define MAX_LISTDIR_PATH_LENGTH (MAX_PATH - 3) +#define MAX_ERRORSTR_LEN 512 + +//HISTORY HANDLING MACRO +#define MIN_HISTORY_POS (history->historyTraversalPos <= 0) +#define MAX_HISTORY_POS (history->historyTraversalPos >= history->historyDepth) + +#include +#include +#include +#include +#include + +#pragma once + +namespace fp { + +typedef struct { + long long size; + //TODO yel spacsio NELLA MEMoria + WCHAR name[MAX_LISTDIR_PATH_LENGTH]; + char nameUTF8[MAX_LISTDIR_PATH_LENGTH * 4]; + SYSTEMTIME createTime; + SYSTEMTIME lastAccessTime; + SYSTEMTIME lastWriteTime; + bool isFile; + bool isHidden; + +} directoriesInfo; + + +struct History { + std::vector previousPaths; + std::vector previousPathsUTF8; + //warnings e 1 cosa + //int historyDepth = -1; + //TODO Limitar historial + //const int maxHistoryDepth = 10000; + //int currentStart = 0; + int historyDepth; + int historyTraversalPos; + bool isAdditionTime; + + History(){ + historyTraversalPos = historyDepth = -1; + isAdditionTime = true; + } + + // wchar* operator[](int idx){ + // if (idx > previousPaths.size()) + // int newPos = idx + currentStart; + + // if (newPos < 0) return previousPaths[maxHistoryDepth - (newPos % maxHistoryDepth)]; + // else return previousPaths[newPos % maxHistoryDepth]; + + // } + + // void push_back(wchar* path){ + // if (previousPaths.size() < maxHistoryDepth) previousPaths.push_back(path); + // else { + // previousPaths[currentStart++] = path; + // } + // } + + +}; + +enum HistoryMovement { + HISTORY_FORWARD = 1, + HISTORY_BACKWARD = 0 +}; + +enum ListDirectoryError { + DIRECTORY_ERROR_PATH_TOO_LONG = -1, + DIRECTORY_ERROR_ACCESSING_CONTENT = -2 +}; + +enum AgnosticDirError { + AGDIR_ERROR_ACCESS_DENIED = 1 +}; + +namespace ErrorMessages { + char addrBarError[] = "Failed to open folder: invalid path"; + char tableElementError[] = "Failed to open folder: access restricted to non-admin users"; + char accessDeniedError[] = "Failed to open folder: access denied"; + char listDirectoryError[] = "Failed to open folder: unknown error"; + char moveUpError[] = "Failed to move up: reached volume root?"; +}; + +namespace Label { + wchar_t saveFileLabel[] = L"Save file: "; + wchar_t loadFileLabel[] = L"Select a file: "; + wchar_t selectDirectoryLabel[] = L"Select a directory: "; +}; + +enum ListFlags { + LIST_DIRECTORY = (1<<0), + LIST_VOLUME = (1<<1) +}; + +enum WindowFlags { + FULLSCREEN = (1<<0), + MODAL = (1<<1), + FILE_LOAD = (1<<2), + FILE_SAVE = (1<<3), + DIRECTORY_SELECT = (1<<4) +}; + +enum ExitFlags { + CONTINUE = (1<<0), + SELECTED = (1<<1), + CLOSED = (1<<2) +}; + +enum DebugVerbosity { + DIRECTORY = (1<<0), + VOLUME = (1<<1), + EXTENSION = (1<<2), + LOGIC = (1<<3) +}; + +//VARS +#ifdef FPDEBUG +bool debug = true; +#else +bool debug = false; +#endif + +// Window open bool +bool windowOpen = true; +bool windowConfigured = false; + +//Flags used to determine: +// window format +//int windowFlags = 0; +// if it's time to load new data +int listFlags = LIST_DIRECTORY | LIST_VOLUME; + +//Array used to display current error +char error[MAX_ERRORSTR_LEN]; +//wchar_t errorUTF8[MAX_ERRORSTR_LEN * 4]; +bool showError = false; + +//Stores found volumes +//TODO onPresentPaths might not be the best name +std::vector onPresentPaths; +std::vector onPresentPathsUTF8; +int numVolumes; + +//currentPath is the one used to retrieve data, then copied to addrBarVal for display. +//addrBarVal is also used as a bacukp in case new currentPath is invalid +//chosenFile stores absolute file path to return +//TODO: hay historial. Coalescer en una sola? +//cursed C momento: necesario ptr en otra var para mandar a wchar_t** de firma +wchar_t currentPath[MAX_PATH]; +//wchar_t* currentPathPtr = ¤tPath[0]; +wchar_t addrBarVal[MAX_LISTDIR_PATH_LENGTH]; +char addrBarValUTF8[MAX_LISTDIR_PATH_LENGTH * 4]; +//wchar_t* addrBarValPtr = &addrBarVal[0]; +wchar_t chosenPath[MAX_PATH]; +char chosenPathUTF8[MAX_PATH * 4]; + +//Stores entires found within a given directory +//static int currentItemIdx = -1; +std::vector directoryContents; +int numFiles = 0; + +//Going one level up needs to be hardcoded like this due to function inputMove needing a wchar_t** +//c pervirtio con unicode std::wstring s(L"←→↑↓"); +wchar_t moveUp[] = L".."; + +bool isListVolumesAdequate = true; +bool isListDirectoriesAdequate = true; + +//RenderTime vars for filtering +bool showHidden = false; +bool filterByExtension = false; +std::vector extensions; + +History* history; + +int debugVerbosity = 0; +/* DEBUG VERBOSITY */ + +void setDebugInfo(int debugFlags) { + debugVerbosity = debugFlags; +} + +/* FILE PICKER MOMENTO */ + +/* DIRECTORIES */ + +bool retrieveCurrentDirectory(wchar_t* currentPath){ + if(GetCurrentDirectory(MAX_PATH, currentPath)) return true; + return false; +} + +bool moveDirectory(wchar_t* currentPath){ + log_directory(currentPath); + if(SetCurrentDirectory(currentPath)) return true; + return false; +} + +int listDirectory(std::wstring path, std::vector *directoryContents){ + HANDLE hFind = INVALID_HANDLE_VALUE; + WIN32_FIND_DATA ffd; + LARGE_INTEGER filesize; + int numFiles = 0; + + if (path.length() > (MAX_LISTDIR_PATH_LENGTH)) return DIRECTORY_ERROR_PATH_TOO_LONG; + path = path + L"\\*"; + hFind = FindFirstFile(path.c_str(), &ffd); + if (INVALID_HANDLE_VALUE == hFind) return DIRECTORY_ERROR_ACCESSING_CONTENT; + do { + if(!wcscmp(ffd.cFileName, L".") || !wcscmp(ffd.cFileName, L"..")) continue; + log_directory("BUCLE listDirectory iteracion " + std::to_string(numFiles)); + + directoriesInfo* itemInfo; + if (directoryContents->size() <= numFiles){ + itemInfo = new directoriesInfo(); + directoryContents->push_back(itemInfo); + } else { + itemInfo = directoryContents->at(numFiles); + } + log_directory("MEMORY ASSIGNES iteration " + std::to_string(numFiles)); + + //A registrar info, fiera + itemInfo->isFile = (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? true : false; + itemInfo->isHidden = (ffd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ? true : false; + //Tamaño + filesize.QuadPart = ((ffd.nFileSizeHigh * (MAXDWORD+1)) + ffd.nFileSizeLow); + itemInfo->size = filesize.QuadPart; + //Fechitssss + FileTimeToSystemTime(&ffd.ftCreationTime, &itemInfo->createTime); + FileTimeToSystemTime(&ffd.ftLastAccessTime, &itemInfo->lastAccessTime); + FileTimeToSystemTime(&ffd.ftLastWriteTime, &itemInfo->lastWriteTime); + //Nombre de la cosita + uint64_t idx = 0; + do { + itemInfo->name[idx] = ffd.cFileName[idx]; + itemInfo->nameUTF8[idx] = ffd.cFileName[idx]; + idx++; + } while (ffd.cFileName[idx]); + itemInfo->name[idx] = '\0'; + itemInfo->nameUTF8[idx] = '\0'; + log_directory("INFORMACION ALMACENADA iteracion " + std::to_string(numFiles)); + + numFiles++; + } while (FindNextFile(hFind, &ffd) != 0); + FindClose(hFind); + return numFiles; +} + +long getLastSystemError(){ + DWORD winLastError = GetLastError(); + switch(winLastError){ + case ERROR_ACCESS_DENIED: + return AGDIR_ERROR_ACCESS_DENIED; + break; + default: + return winLastError; + break; + } +} + +/* VOLUMES */ + +//new wchar_t*[Wchar_TCount * sizeof(WWCHAR_T) +/*idea, si quisiera que empezase en punto X del string + coger el param opcional y crear un puntero a la posicion X del array para empezar desde ahi + int explodePaths(TWCHAR_T* volumePaths, int volumePathLength, int volumePathBufferSize, + wchar_t separator, std::vector *dest, , int startingFrom = 0); + if (nextOcurrence == NULL) return 0; +*/ +int explodePaths(wchar_t* volumePaths, int volumePathsBufferSize, wchar_t separator, std::vector *dest, std::vector *destUTF8, int depth = 1){ + //Por alguna razón, esto que dice acabar con 2 NULL acaba con 3; de locos. + //https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumepathnamesforvolumenamew + + wchar_t* nextOcurrence = wcschr(volumePaths, separator); + + wchar_t* itemPath; + char* itemPathUTF8; + itemPath = (wchar_t*)calloc(2, volumePathsBufferSize); + itemPathUTF8 = (char*)calloc(4, volumePathsBufferSize); + + int pathLengthIdx = 0; + for (; volumePaths[pathLengthIdx] != nextOcurrence[0]; pathLengthIdx++) { + log_volume(volumePaths[0] << " ENTERS " << std::to_string(pathLengthIdx)); + itemPath[pathLengthIdx] = volumePaths[pathLengthIdx]; + } + itemPath[pathLengthIdx + 1] = '\0'; + dest->push_back(itemPath); + WideCharToMultiByte(CP_UTF8, NULL, itemPath, -1, itemPathUTF8, + 4 * volumePathsBufferSize, NULL, NULL); + destUTF8->push_back(itemPathUTF8); + + + log_wvolume(dest->at(dest->size() - 1) << L" EXPLODEPATH"); + log_volume(destUTF8->at(destUTF8->size() - 1) << " EXPLODEPATH"); + + if (nextOcurrence[0] == nextOcurrence[1]) return depth; + depth++; + return explodePaths(nextOcurrence + sizeof(wchar_t), (volumePathsBufferSize - pathLengthIdx), separator, dest, destUTF8, depth); +} + + +int listVolumes(std::vector *onPresentPaths, std::vector *onPresentPathsUTF8){ + HANDLE hFind = INVALID_HANDLE_VALUE; + const wchar_t separator = '\0'; + + int numVolumes = 0; + //Volume name + wchar_t volumeName[MAX_PATH]; + int volumeNameSize = sizeof volumeName / sizeof volumeName[0]; + //Paths + int volumePathsBufferSize = (MAX_PATH + 1) * sizeof(wchar_t); + unsigned long volumePathLength; + wchar_t volumePaths[volumePathsBufferSize]; + std::fill(volumePaths, volumePaths + volumePathsBufferSize, '\0'); + + hFind = FindFirstVolume(volumeName, volumeNameSize); + if (INVALID_HANDLE_VALUE == hFind) return -2; + do { + + if(GetVolumePathNamesForVolumeName(volumeName, volumePaths, volumePathsBufferSize, &volumePathLength)){ + + if (volumePathLength == 1) { + log_volume("Skill Issue"); + continue; + } + log_wvolume(volumeName); + + //DEBUG: pathSchecker + // if (debug && volumePaths[0] == 'E') { + // std::cout << volumePathLength << std::endl; + // /*exit(1);*/ + // for (int i = 0; i < volumePathsBufferSize; i++){ + // std::cout << std::to_string(i) + ": "; + // std::cout << volumePaths[i]; + // std::cout << " | "; + // } + // std::cout << std::endl << "I IA" << std::endl; + // exit(1); + // } + if (debug) { + if(numVolumes += explodePaths(volumePaths, volumePathsBufferSize, separator, onPresentPaths, onPresentPathsUTF8)){ + for (int i = 0; i < onPresentPaths->size(); i++){ + log_wvolume(onPresentPaths->at(i)); + } + } + } + //std::cout << volumePaths << std::endl; + + log_volume(std::to_string(volumePathLength) + "<- VOLUME PATH LENGTH"); + log_volume("THE END"); + } else { + log_volume("no volumes found"); + } + //TODO benchimarqui + std::fill(volumePaths, volumePaths + volumePathsBufferSize, '\0'); + } while (FindNextVolume(hFind, volumeName, volumeNameSize) != 0); + log_volume(std::to_string(onPresentPaths->size()) + " JUST BEFORE MAIN"); + FindVolumeClose(hFind); + return numVolumes; +} + + +/* DISPLAY */ + + +bool compareLastWchar(std::vector *lastCharCandidates, wchar_t* string){ + bool matchingExtension = false; + for (int i = 0; i < lastCharCandidates->size(); i++){ + log_wextension(lastCharCandidates->at(i) << L" <- FILTERING EXTENSION"); + + if(wcslen(string) < lastCharCandidates->at(i).length()) continue; + wchar_t* potentialExtension = &string[wcslen(string) - lastCharCandidates->at(i).length()]; + + log_wextension(potentialExtension << L" LEN " + std::to_wstring(wcslen(potentialExtension)) + L" <- VS -> " + lastCharCandidates->at(i) + L" LEN " + std::to_wstring(lastCharCandidates->at(i).length())); + //+ strlen(potentialExtension) + std::to_string(lastCharCandidates->at(i).length()) + if(!wcscmp(potentialExtension, lastCharCandidates->at(i).c_str())) { + log_extension("VALID EXTENSION"); + matchingExtension = true; + } + } + return matchingExtension; +} + +//TODO huh +// int handleFolderAccessResult(int listFlags, wchar_t* nextPath, bool* error, wchar_t* errorDest, \ + // const wchar_t* errorContent, History* history, wchar_t* currentPath = NULL, wchar_t* addrBarVal = NULL){ + // *error = false; + // if(!moveDirectory(nextPath)) { + // *error = true; + // if(currentPath && addrBarVal) { + // wcscpy(errorDest, errorContent); + // wcscpy(addrBarVal, currentPath); + // } + // return listFlags; + // } + // if(currentPath && addrBarVal) { + // wcscpy(currentPath, addrBarVal); + // history->isAdditionTime = true; + // } + // return (listFlags |= LIST_DIRECTORY); +// } + + +//TODO huh, vale, no pasa por listdirectory por la flag, pero esto se podria hacer mejor manteniendo el no tirar de disco tb? +int handleFolderAccessResult(int listFlags, wchar_t* nextPath, bool* error, char* errorDest, \ + const char* errorContent, History* history, wchar_t* currentPath , wchar_t* addrBarVal){ + *error = false; + if(!moveDirectory(nextPath)) { + *error = true; + strcpy(errorDest, errorContent); + wcscpy(addrBarVal, currentPath); + return listFlags; + } + //wcscpy(currentPath, addrBarVal); + history->isAdditionTime = true; + return (listFlags |= LIST_DIRECTORY); +} + +int handleFolderAccessResult(int listFlags, wchar_t* nextPath, bool* error, char* errorDest, \ + const char* errorContent, History* history, bool isAdditionTime){ + *error = false; + if(!moveDirectory(nextPath)) { + *error = true; + strcpy(errorDest, errorContent); + return listFlags; + } + if (isAdditionTime) history->isAdditionTime = true; + return (listFlags |= LIST_DIRECTORY); +} + +/* HISTORIAL */ + +void addPathToHistory(History *history, wchar_t* pathToAdd){ + wchar_t* path; + char* pathUTF8; + if (history->historyTraversalPos + 1 >= history->previousPaths.size()){ + path = (wchar_t*)calloc(2, MAX_PATH); + history->previousPaths.push_back(path); + pathUTF8 = (char*)calloc(4, MAX_PATH); + WideCharToMultiByte(CP_UTF8, NULL, path, -1, pathUTF8, + 4 * MAX_PATH, NULL, NULL); + history->previousPathsUTF8.push_back(pathUTF8); + } else { + path = history->previousPaths.at(history->historyTraversalPos + 1); + pathUTF8 = history->previousPathsUTF8.at(history->historyTraversalPos + 1); + } + wcsncpy(path, pathToAdd, MAX_PATH); + history->historyTraversalPos++; + history->historyDepth = history->historyTraversalPos; + history->isAdditionTime = false; +} + +wchar_t* moveThroughHistory(History *history, HistoryMovement movement) { + int sign = (movement == HISTORY_BACKWARD ? -1 : 1); + switch(movement){ + case HISTORY_BACKWARD: + if(MIN_HISTORY_POS) + return history->previousPaths.at(history->historyTraversalPos); + break; + case HISTORY_FORWARD: + if(MAX_HISTORY_POS) + return history->previousPaths.at(history->historyDepth); + break; + default: + return history->previousPaths.at(history->historyDepth); + } + history->historyTraversalPos += sign; + return history->previousPaths.at(history->historyTraversalPos); +} + +/* RENDERING */ + +void windowRendering(char*, bool*, bool*, int); +void renderFilePicker(char* userPath, bool* windowOpen, bool* memoryFreed, int windowFlags = 0) { + //TODO filesystem watcher + //TODO let user handle memory management + //TODO use local val to create actual windowFlags when expanding functionality + #ifdef WIN32 + SetConsoleOutputCP(65001); + #endif + + if (!windowConfigured) { + listFlags = LIST_DIRECTORY | LIST_VOLUME; + history = new History(); + if (windowFlags & FULLSCREEN){ + ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f)); + ImGui::SetNextWindowSize(ImGui::GetIO().DisplaySize); + windowFlags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoResize; + } else { + ImGui::SetNextWindowPos(ImVec2(50.0f, 50.0f)); + ImGui::SetNextWindowSize(ImVec2(500.0f, 500.0f)); + windowFlags = ImGuiWindowFlags_None; + //const ImGuiViewport* viewport = ImGui::GetMainViewport(); + } + windowConfigured = true; + *memoryFreed = false; + } else windowFlags = 0; + windowRendering(userPath, windowOpen, memoryFreed, windowFlags); +} + +void freeResources(bool* memoryFreed){ + windowConfigured = false; + for (int i = 0; i < history->previousPaths.size(); i++){ + free(history->previousPaths.at(i)); + } + for (int i = 0; i < onPresentPaths.size(); i++){ + free(onPresentPaths.at(i)); + } + for (int i = 0; i < history->previousPathsUTF8.size(); i++){ + free(history->previousPathsUTF8.at(i)); + } + for (int i = 0; i < onPresentPathsUTF8.size(); i++){ + free(onPresentPathsUTF8.at(i)); + } + onPresentPaths.resize(0); + onPresentPathsUTF8.resize(0); + //previousPaths.resize(0); + delete history; + *memoryFreed = true; +} + +void exitWindow(char* userPath, bool* windowOpen, bool* memoryFreed, int exitFlag){ + if(exitFlag & SELECTED) { + if (chosenPath[0] == '\0') return; + strcpy(userPath, chosenPathUTF8); + *windowOpen = false; + } + freeResources(memoryFreed); + return; +} + +void windowRendering(char* userPath, bool* windowOpen, bool* memoryFreed, int windowFlags = 0){ + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::Begin("File picker", windowOpen, windowFlags); + ImGui::PopStyleVar(1); + //log_debugcpp(*windowOpen); + //Listar UNA VEZ volumenes + if (listFlags & LIST_VOLUME) { + listFlags &= ~LIST_VOLUME; + numVolumes = listVolumes(&onPresentPaths, &onPresentPathsUTF8); + log_volume(std::to_string(numVolumes) + "<- depth MAIN size() ->" + std::to_string(onPresentPaths.size())); + } + + //Listar UNA VEZ directorios + //ImGui::Text("%s PRE DIRECTORY TREATMENTO", currentPath); + if (listFlags & LIST_DIRECTORY) { + listFlags &= ~LIST_DIRECTORY; + chosenPath[0] = '\0'; + log_directory("ADECUADO LISTAR DIRECTORIOS"); + if(!retrieveCurrentDirectory(currentPath)) { + log_directory("NO HABIA DIRECTORIO GetCurrentPath()"); + exit(EXIT_FAILURE); + } + // + //TODO Expand extension filter + + numFiles = listDirectory(std::wstring(currentPath), &directoryContents); + //std::cout << numFiles; + if (numFiles < 0) { + long directoryErrorCode; + log_directory("FALLO LA FUNCION, VALOR NEGATIVO " + std::to_string(numFiles)); + if (numFiles == DIRECTORY_ERROR_ACCESSING_CONTENT) directoryErrorCode = getLastSystemError(); + showError = true; + switch(directoryErrorCode) { + case AGDIR_ERROR_ACCESS_DENIED: + strcpy(error, ErrorMessages::accessDeniedError); + wcscpy(addrBarVal, history->previousPaths.at(history->historyTraversalPos)); + wcscpy(currentPath, history->previousPaths.at(history->historyTraversalPos)); + numFiles = listDirectory(history->previousPaths.at(history->historyTraversalPos), &directoryContents); + break; + default: + strcpy(error, ErrorMessages::listDirectoryError); + wcscpy(currentPath, addrBarVal); + numFiles = listDirectory(std::wstring(currentPath), &directoryContents); + break; + } + history->isAdditionTime = false; + } else { + showError = false; + wcscpy(addrBarVal, currentPath); + if(history->isAdditionTime) addPathToHistory(history, addrBarVal); + } + } + + /* It's renderin' time */ + + if(showError) ImGui::Text(error); + ImGui::Text("Select a file:"); + + //BACK + ImGui::BeginDisabled(MIN_HISTORY_POS); + if(ImGui::Button("Back")) { + wchar_t* interfaceMovementButtonsPath = moveThroughHistory(history, HISTORY_BACKWARD); + listFlags = handleFolderAccessResult(listFlags, interfaceMovementButtonsPath, + &showError, error, ErrorMessages::moveUpError, history, false); + } + ImGui::EndDisabled(); + //FORWARD + ImGui::SameLine(); + ImGui::BeginDisabled(MAX_HISTORY_POS); + if(ImGui::Button("Forward")) { + wchar_t* interfaceMovementButtonsPath = moveThroughHistory(history, HISTORY_FORWARD); + listFlags = handleFolderAccessResult(listFlags, interfaceMovementButtonsPath, + &showError, error, ErrorMessages::moveUpError, history, false); + } + ImGui::EndDisabled(); + + //MOVE UP + ImGui::SameLine(); + if(ImGui::Button("Move Up")) { + listFlags = handleFolderAccessResult(listFlags, moveUp, &showError, + error, ErrorMessages::moveUpError, history, true); + } + + ImGui::SameLine(); + //BARRA DE DIRECCIONES + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize("Enter").x + ImGui::GetStyle().ItemSpacing.x * 2) ); + WideCharToMultiByte(CP_UTF8, NULL, addrBarVal, -1, addrBarValUTF8, + 4 * MAX_PATH, NULL, NULL); + if(ImGui::InputText("##addrbar", addrBarValUTF8, IM_ARRAYSIZE(addrBarValUTF8), ImGuiInputTextFlags_EnterReturnsTrue )){ + log_directory(currentPath <<" ADDRBAR INTENTO"); + MultiByteToWideChar(CP_UTF8, NULL, addrBarValUTF8, -1, addrBarVal, 2 * MAX_PATH); + listFlags = handleFolderAccessResult(listFlags, addrBarVal, &showError, error, ErrorMessages::addrBarError, history, currentPath, addrBarVal); + } + ImGui::PopItemWidth(); + ImGui::SameLine(); + if(ImGui::Button("Enter")){ + log_directory(currentPath <<" ADDRBAR INTENTO"); + listFlags = handleFolderAccessResult(listFlags, addrBarVal, &showError, error, ErrorMessages::addrBarError, + history, currentPath, addrBarVal); + } + //ImGui::Text("%s TEMPADDRBAR", currentPath); + + //LA GRAN TABLACIÓN: ACTOR EN LAS SOMBRAS + static ImGuiTableFlags splitterTableFlags = ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; + if (ImGui::BeginTable("##splitterTable", 2, splitterTableFlags, ImVec2(-FLT_MIN, 0.8f * ImGui::GetTextLineHeightWithSpacing()))){ + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + + //VOLUMENES + static ImGuiTableFlags volumesFlags = ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY ; + if (ImGui::BeginTable("##volumesTable", 1, volumesFlags, ImVec2(-FLT_MIN, 20 * ImGui::GetTextLineHeightWithSpacing()))){ + ImGui::TableSetupColumn("Volumes", ImGuiTableColumnFlags_NoHide); + //ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); + //ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 18.0f); + ImGui::TableHeadersRow(); + ImGui::TableNextRow(); + + if (numVolumes > 0) { + for (int i = 0; i < onPresentPaths.size(); i++) { + ImGui::TableNextColumn(); + // ImGui::PushID(i); + ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); + if(ImGui::Button(onPresentPathsUTF8.at(i))){ + listFlags = handleFolderAccessResult(listFlags, onPresentPaths.at(i), &showError, error, + ErrorMessages::moveUpError, history, true); + } + ImGui::PopStyleColor(3); + if (i != onPresentPaths.size() - 1) ImGui::TableNextRow(); + // ImGui::PopID(); + } + } + ImGui::EndTable(); + } + + ImGui::TableNextColumn(); + + //DRAW DIRECTORIOS ENCONTRADOS + static ImGuiTableFlags directoriesFlags = ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable |ImGuiTableFlags_ScrollY ; + if (ImGui::BeginTable("##directoriesTable", 3, directoriesFlags, ImVec2(-FLT_MIN, 20 * ImGui::GetTextLineHeightWithSpacing()))){ + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoHide); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_NoHide); + ImGui::TableSetupColumn("Size", ImGuiTableColumnFlags_NoHide); + //ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); + //ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 18.0f); + ImGui::TableHeadersRow(); + + int idx = 0; + for (; idx < numFiles; idx++) { + if(directoryContents.at(idx)->isHidden && !showHidden) continue; + if(filterByExtension && !directoryContents.at(idx)->isFile) { + //TODO Expand extensions filter + extensions.clear(); + extensions.push_back(L"exe"); + if (!compareLastWchar(&extensions, directoryContents.at(idx)->name)) continue; + } + + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + + //NAME + bool isSelected = false; + WideCharToMultiByte(CP_UTF8, NULL, addrBarVal, -1, addrBarValUTF8, + 4 * MAX_PATH, NULL, NULL); + if (ImGui::Selectable(directoryContents.at(idx)->nameUTF8, &isSelected)){ + if(!directoryContents.at(idx)->isFile) { + wcscpy(chosenPath, addrBarVal); + wcscat(chosenPath, L"\\"); + wcscat(chosenPath, directoryContents.at(idx)->name); + log_directory(chosenPath << L" selected"); + } else { + wcscat(addrBarVal, L"\\"); + wcscat(addrBarVal, directoryContents.at(idx)->name); + log_directory("directo selected"); + listFlags = handleFolderAccessResult(listFlags, addrBarVal, &showError, error, + ErrorMessages::tableElementError, history, currentPath, addrBarVal); + } + //currentItemIdx = -1; + } + ImGui::TableNextColumn(); + + //TYPE + if (directoryContents.at(idx)->isFile) ImGui::Text("Folder"); else ImGui::Text("File"); + ImGui::TableNextColumn(); + + //SIZE + if (!directoryContents.at(idx)->isFile) ImGui::Text("%lld bytes", directoryContents.at(idx)->size); + else ImGui::Text(""); + + //ImGui::SetItemDefaultFocus(); + + } + //DISPLAYING ALTERNATIVE INFO + if (!idx) { + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Folder is empty"); + } + ImGui::EndTable(); + } + ImGui::EndTable(); + } + + + + //ImGui::TreePop(); + //BOTTOM ROW + ImGui::Checkbox("Show hidden", &showHidden); + ImGui::SameLine(); + ImGui::Checkbox("Filter by .exe", &filterByExtension); + ImGui::SameLine(); + + ImGui::SameLine(); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize("Select").x + ImGui::GetStyle().ItemSpacing.x * 2) ); + + ImGui::BeginDisabled(); + WideCharToMultiByte(CP_UTF8, NULL, chosenPath, -1, chosenPathUTF8, + 4 * MAX_PATH, NULL, NULL); + ImGui::InputText("##chosenbar", chosenPathUTF8, IM_ARRAYSIZE(chosenPathUTF8), ImGuiInputTextFlags_EnterReturnsTrue ); + ImGui::EndDisabled(); + + ImGui::SameLine(); + if(ImGui::Button("Select")) { + log_directory(chosenPath << " TRIED TO RETURN"); + //ImGui::End(); + exitWindow(userPath, windowOpen, memoryFreed, ExitFlags::SELECTED); + } + //listFlags = handleFolderAccessResult(listFlags, addrBarVal, &showError, error, ErrorMessages::addrBarError, history, currentPath, addrBarVal); + + ImGui::End(); +} + + +} + + diff --git a/main.cpp b/main.cpp deleted file mode 100644 index 5f92786..0000000 --- a/main.cpp +++ /dev/null @@ -1,758 +0,0 @@ -// Dear ImGui: standalone example application for GLFW + OpenGL 3, using programmable pipeline -// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs - -#define IMGUI_IMPLEMENTATION -#define GL_SILENCE_DEPRECATION - -//DEBUG MACRO -#define log_debugc(str, ...) do { if (debug) fprintf(stdout, "[DEBUG] (%s:%d): " (str) "\n", __FILE__, __LINE__, ##__VA_ARGS__); } while (0) -#define log_debugcpp(str) do { \ - if (debug) std::cout << "[DEBUG]" << "(" << __FILE__ << ":" << __LINE__ << "): " << str << std::endl; \ - } while (0) -#define log_directory(str) if(debugVerbosity & DEBUG_DIRECTORY) log_debugcpp((str)) -#define log_volume(str) if(debugVerbosity & DEBUG_VOLUME) log_debugcpp((str)) -#define log_extension(str) if(debugVerbosity & DEBUG_EXTENSION) log_debugcpp((str)) - -//PATH MACRO -#define MAX_LISTDIR_PATH_LENGTH (MAX_PATH - 3) -#define MAX_ERRORSTR_LEN 512 - -//HISTORY HANDLING MACRO -#define MIN_HISTORY_POS (history->historyTraversalPos <= 0) -#define MAX_HISTORY_POS (history->historyTraversalPos >= history->historyDepth) - -#include "imgui/misc/single_file/imgui_single_file.h" -#include -#include -#include -#include -#include - -// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers. -// To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma. -// Your own project should not be affected, as you are likely to link with a newer binary of GLFW that is adequate for your version of Visual Studio. -#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) -#pragma comment(lib, "legacy_stdio_definitions") -#endif -static void glfw_error_callback(int error, const char* description) -{ - fprintf(stderr, "Glfw Error %d: %s\n", error, description); -} - -bool debug = true; - -// int debugVerbosity = 0; -// enum enumDebugVerbosity { - // DEBUG_DIRECTORY = (1<<0), - // DEBUG_VOLUME = (1<<1), - // DEBUG_EXTENSION = (1<<2) -// }; -// debugVerbosity = DEBUG_DIRECTORY | DEBUG_EXTENSION; -// debugVerbosity &= ~DEBUG_DIRECTORY; -// if (debugVerbosity & (DEBUG_DIRECTORY | DEBUG_EXTENSION)); - - -typedef struct { - long long size; - //TODO yel spacsio NELLA MEMoria - TCHAR name[MAX_LISTDIR_PATH_LENGTH]; - SYSTEMTIME createTime; - SYSTEMTIME lastAccessTime; - SYSTEMTIME lastWriteTime; - bool isFile; - bool isHidden; - -} directoriesInfo; - - -struct History{ - std::vector previousPaths; - //warnings e 1 cosa - //int historyDepth = -1; - //TODO Limitar historial - //const int maxHistoryDepth = 10000; - int historyDepth; - int historyTraversalPos; - bool isAdditionTime; - - History(){ - historyTraversalPos = historyDepth = -1; - isAdditionTime = true; - } -}; - -enum HistoryMovement { - HISTORY_FORWARD = 1, - HISTORY_BACKWARD = 0 -}; - -enum ListDirectoryError { - DIRECTORY_ERROR_PATH_TOO_LONG = -1, - DIRECTORY_ERROR_ACCESSING_CONTENT = -2 -}; - -enum agnosticDirError { - AGDIR_ERROR_ACCESS_DENIED = 1 -}; - -namespace ErrorMessages { - char addrBarError[] = "Failed to open folder: invalid path"; - char tableElementError[] = "Failed to open folder: access restricted to non-admin users"; - char accessDeniedError[] = "Failed to open folder: access denied"; - char listDirectoryError[] = "Failed to open folder: unknown error"; - char moveUpError[] = "Failed to move up: reached volume root?"; -}; - -//TODO UNICORDEO -/* FILE PICKER MOMENTO */ - - -/* DIRECTORIES */ - - -bool retrieveCurrentDirectory(char** currentPath){ - if(GetCurrentDirectory(MAX_PATH, *currentPath)) return true; - return false; -} - -bool moveDirectory(char** currentPath){ - log_debugcpp(*currentPath); - if(SetCurrentDirectory(*currentPath)) return true; - return false; -} - -int listDirectory(std::string path, std::vector *directoryContents){ - HANDLE hFind = INVALID_HANDLE_VALUE; - WIN32_FIND_DATA ffd; - LARGE_INTEGER filesize; - int numFiles = 0; - - if (path.length() > (MAX_LISTDIR_PATH_LENGTH)) return DIRECTORY_ERROR_PATH_TOO_LONG; - path = path + "\\*"; - hFind = FindFirstFile(path.c_str(), &ffd); - if (INVALID_HANDLE_VALUE == hFind) return DIRECTORY_ERROR_ACCESSING_CONTENT; - do { - if(!strcmp(ffd.cFileName, ".") || !strcmp(ffd.cFileName, "..")) continue; - log_debugcpp("BUCLE listDirectory iteracion " + std::to_string(numFiles)); - - directoriesInfo* itemInfo; - if (directoryContents->size() <= numFiles){ - itemInfo = new directoriesInfo(); - directoryContents->push_back(itemInfo); - } else { - itemInfo = directoryContents->at(numFiles); - } - log_debugcpp("MEMORY ASSIGNES iteration " + std::to_string(numFiles)); - - //A registrar info, fiera - itemInfo->isFile = (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? true : false; - itemInfo->isHidden = (ffd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ? true : false; - //Tamaño - filesize.QuadPart = ((ffd.nFileSizeHigh * (MAXDWORD+1)) + ffd.nFileSizeLow); - itemInfo->size = filesize.QuadPart; - //Fechitssss - FileTimeToSystemTime(&ffd.ftCreationTime, &itemInfo->createTime); - FileTimeToSystemTime(&ffd.ftLastAccessTime, &itemInfo->lastAccessTime); - FileTimeToSystemTime(&ffd.ftLastWriteTime, &itemInfo->lastWriteTime); - //Nombre de la cosita - uint64_t idx = 0; - do { - itemInfo->name[idx] = ffd.cFileName[idx]; - idx++; - } while (ffd.cFileName[idx]); - itemInfo->name[idx] = '\0'; - log_debugcpp("INFORMACION ALMACENADA iteracion " + std::to_string(numFiles)); - - numFiles++; - } while (FindNextFile(hFind, &ffd) != 0); - FindClose(hFind); - return numFiles; -} - -long getLastDirectorySystemError(){ - long winLastError = GetLastError(); - switch(winLastError){ - case ERROR_ACCESS_DENIED: - return AGDIR_ERROR_ACCESS_DENIED; - break; - default: - return -1; - break; - } -} - -/* VOLUMES */ - -//new char*[CharCount * sizeof(WCHAR) -/*idea, si quisiera que empezase en punto X del string - coger el param opcional y crear un puntero a la posicion X del array para empezar desde ahi - int explodePaths(TCHAR* volumePaths, int volumePathLength, int volumePathBufferSize, - char separator, std::vector *dest, , int startingFrom = 0); - if (nextOcurrence == NULL) return 0; -*/ -int explodePaths(TCHAR* volumePaths, int volumePathsBufferSize, char separator, std::vector *dest, int depth = 1){ - //Por alguna razon esta puta mierda que dice acabar con 2 NULL acaba con 3; de locos. - //https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumepathnamesforvolumenamew - - char* nextOcurrence = strchr(volumePaths, separator); - - char* itemPath; - itemPath = (char*)calloc(1, volumePathsBufferSize); - - int pathLengthIdx = 0; - for (; volumePaths[pathLengthIdx] != nextOcurrence[0]; pathLengthIdx++) { - if (debug) { std::cout << volumePaths[0]; std::cout << " ENTERS " + std::to_string(pathLengthIdx) << std::endl; } - itemPath[pathLengthIdx] = volumePaths[pathLengthIdx]; - } - itemPath[pathLengthIdx + 1] = '\0'; - dest->push_back(itemPath); - - log_debugcpp(dest->at(dest->size() - 1) << " EXPLODEPATH"); - - if (nextOcurrence[0] == nextOcurrence[1]) return depth; - depth++; - return explodePaths(nextOcurrence + sizeof(TCHAR), (volumePathsBufferSize - pathLengthIdx), separator, dest, depth); -} - - -int listVolumes(std::vector *onPresentPaths){ - HANDLE hFind = INVALID_HANDLE_VALUE; - const char separator = '\0'; - - int numVolumes = 0; - //Volume name - TCHAR volumeName[MAX_PATH]; - int volumeNameSize = sizeof volumeName / sizeof volumeName[0]; - //Paths - int volumePathsBufferSize = (MAX_PATH + 1) * sizeof(TCHAR); - unsigned long volumePathLength; - TCHAR volumePaths[volumePathsBufferSize]; - std::fill(volumePaths, volumePaths + volumePathsBufferSize, '\0'); - - hFind = FindFirstVolume(volumeName, volumeNameSize); - if (INVALID_HANDLE_VALUE == hFind) return -2; - do { - - if(GetVolumePathNamesForVolumeName(volumeName, volumePaths, volumePathsBufferSize, &volumePathLength)){ - - if (volumePathLength == 1) { if (debug) std::cout << "Skill Issue" << std::endl; continue; } - log_debugcpp(volumeName); - - //DEBUG: pathSchecker - // if (debug && volumePaths[0] == 'E') { - // std::cout << volumePathLength << std::endl; - // /*exit(1);*/ - // for (int i = 0; i < volumePathsBufferSize; i++){ - // std::cout << std::to_string(i) + ": "; - // std::cout << volumePaths[i]; - // std::cout << " | "; - // } - // std::cout << std::endl << "I IA" << std::endl; - // exit(1); - // } - - if(numVolumes += explodePaths(volumePaths, volumePathsBufferSize, separator, onPresentPaths)){ - for (int i = 0; i < onPresentPaths->size(); i++){ - std::cout << onPresentPaths->at(i) << std::endl; - } - } - //std::cout << volumePaths << std::endl; - - log_debugcpp(std::to_string(volumePathLength) + "<- VOLUME PATH LENGTH"); - log_debugcpp("THE END"); - - }else{ - log_debugcpp("no volumes found wtf"); - } - //TODO benchimarqui - std::fill(volumePaths, volumePaths + volumePathsBufferSize, '\0'); - } while (FindNextVolume(hFind, volumeName, volumeNameSize) != 0); - log_debugcpp(std::to_string(onPresentPaths->size()) + " JUST BEFORE MAIN"); - FindVolumeClose(hFind); - return numVolumes; -} - - -/* DISPLAY */ - - -bool compareLastChar(std::vector *lastCharCandidates, char* string){ - bool matchingExtension = false; - for (int i = 0; i < lastCharCandidates->size(); i++){ - log_debugcpp(lastCharCandidates->at(i) + " <- FILTERING EXTENSION"); - - if(strlen(string) < lastCharCandidates->at(i).length()) continue; - char* potentialExtension = &string[strlen(string) - lastCharCandidates->at(i).length()]; - - log_debugcpp(potentialExtension << " LEN " + std::to_string(strlen(potentialExtension)) + " <- VS -> " + lastCharCandidates->at(i) + " LEN " + std::to_string(lastCharCandidates->at(i).length())); - //+ strlen(potentialExtension) + std::to_string(lastCharCandidates->at(i).length()) - if(!strcmp(potentialExtension, lastCharCandidates->at(i).c_str())) { - log_debugcpp("VALID EXTENSION"); - matchingExtension = true; - } - } - return matchingExtension; -} - -bool inputMove(bool* error, char** str){ - *error = false; - if(!moveDirectory(str)) { *error = true; return false; } - return true; -} - -void handleFolderAccessResult(bool isListDirectoriesAdequate, char* currentPath, \ - char* addrBarVal, char* errorDest, const char* errorContent, History* history){ - if (isListDirectoriesAdequate) { strcpy(currentPath, addrBarVal); history->isAdditionTime = true; } - else strcpy(addrBarVal, currentPath); - strcpy(errorDest, errorContent); -} - -/* HISTORIAL */ - -void addPathToHistory(History *history, char* pathToAdd){ - char* path; - //int ajjj = history->previousPaths.size(); - if (history->historyTraversalPos + 1 >= history->previousPaths.size()){ - path = (char*)calloc(1, MAX_PATH); - history->previousPaths.push_back(path); - } else { - path = history->previousPaths.at(history->historyTraversalPos + 1); - } - strncpy(path, pathToAdd, MAX_PATH); - history->historyTraversalPos++; - history->historyDepth = history->historyTraversalPos; - history->isAdditionTime = false; -} - -char** moveThroughHistory(History *history, HistoryMovement movement) { - int sign = (movement == HISTORY_BACKWARD ? -1 : 1); - switch(movement){ - case HISTORY_BACKWARD: - if(MIN_HISTORY_POS) - return &history->previousPaths.at(history->historyTraversalPos); - break; - case HISTORY_FORWARD: - if(MAX_HISTORY_POS) - return &history->previousPaths.at(history->historyDepth); - break; - default: - return &history->previousPaths.at(history->historyDepth); - } - history->historyTraversalPos += sign; - return &history->previousPaths.at(history->historyTraversalPos); -} - - -/* FIN FILE PICKER MOMENTO */ - - -int main(int, char**) { - // Setup window - glfwSetErrorCallback(glfw_error_callback); - if (!glfwInit()) - return 1; - - // Decide GL+GLSL versions -#if defined(IMGUI_IMPL_OPENGL_ES2) - // GL ES 2.0 + GLSL 100 - const char* glsl_version = "#version 100"; - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); - glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); -#elif defined(__APPLE__) - // GL 3.2 + GLSL 150 - const char* glsl_version = "#version 150"; - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only - glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac -#else - // GL 3.0 + GLSL 130 - const char* glsl_version = "#version 130"; - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); - //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only - //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 3.0+ only -#endif - - // Create window with graphics context - GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL3 example", NULL, NULL); - if (window == NULL) - return 1; - glfwMakeContextCurrent(window); - glfwSwapInterval(1); // Enable vsync - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - //ImGui::StyleColorsLight(); - - // Setup Platform/Renderer backends - ImGui_ImplGlfw_InitForOpenGL(window, true); - ImGui_ImplOpenGL3_Init(glsl_version); - - // Load Fonts - // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). - // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. - // - Read 'docs/FONTS.md' for more instructions and details. - // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! - //io.Fonts->AddFontDefault(); - //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); - - // Our state - bool show_demo_window = true; - bool show_another_window = false; - ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - // Main loop - while (!glfwWindowShouldClose(window)) { - // Poll and handle events (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. - glfwPollEvents(); - - // Start the Dear ImGui frame - ImGui_ImplOpenGL3_NewFrame(); - ImGui_ImplGlfw_NewFrame(); - ImGui::NewFrame(); - - // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). - if (show_demo_window) - ImGui::ShowDemoWindow(&show_demo_window); - - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. - { - static float f = 0.0f; - static int counter = 0; - - ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. - - ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) - ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state - ImGui::Checkbox("Another Window", &show_another_window); - - ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f - ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color - - if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) - counter++; - ImGui::SameLine(); - ImGui::Text("counter = %d", counter); - - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::End(); - } - - { - ImGui::Begin("File Picker in 4K"); - - static History* history = new History(); - static bool showError = false; - static char error[MAX_ERRORSTR_LEN]; - static bool isListVolumesAdequate = true; - static bool isListDirectoriesAdequate = true; - - //Listar UNA VEZ volumenes - static int numVolumes; - static std::vector onPresentPaths; - - if (isListVolumesAdequate) { - isListVolumesAdequate = false; - //std::cout << isListVolumesAdequate << std::endl; - numVolumes = listVolumes(&onPresentPaths); - log_debugcpp(std::to_string(numVolumes) + "<- depth MAIN size() ->" + std::to_string(onPresentPaths.size())); - } - - //Listar UNA VEZ directorios - //cursed C momento: necesario ptr en otra var para mandar a char** de firma - static char currentPath[MAX_PATH]; - static char* currentPathPtr = ¤tPath[0]; - static char addrBarVal[MAX_LISTDIR_PATH_LENGTH]; - static char* addrBarValPtr = &addrBarVal[0]; - - //static int currentItemIdx = -1; - //static std::vector directoryContents; - static std::vector directoryContents; - static int numFiles = 0; - - //ImGui::Text("%s PRE DIRECTORY TREATMENTO", currentPath); - - if(isListDirectoriesAdequate) { - log_debugcpp("ADECUADO LISTAR DIRECTORIOS"); - isListDirectoriesAdequate = false; - if(!retrieveCurrentDirectory(¤tPathPtr)) { - log_debugcpp("NO HABIA DIRECTORIO GetCurrentPath()"); - goto filepickerFailure; - } - // - //TODO ELIMINAR RESTRICCION EXE; PRUEBITA DEL SIGNIORE - - numFiles = listDirectory(std::string(currentPath), &directoryContents); - //std::cout << numFiles; - if (numFiles < 0) { - //TODO quitar GetLastError() de aqui - long directoryErrorCode; - log_debugcpp("FALLO LA FUNCION, VALOR NEGATIVO " + std::to_string(numFiles)); - if (numFiles == DIRECTORY_ERROR_ACCESSING_CONTENT) directoryErrorCode = getLastDirectorySystemError(); - showError = true; - switch(directoryErrorCode) { - case AGDIR_ERROR_ACCESS_DENIED: - strcpy(error, ErrorMessages::accessDeniedError); - strcpy(addrBarVal, history->previousPaths.at(history->historyTraversalPos)); - strcpy(currentPath, history->previousPaths.at(history->historyTraversalPos)); - numFiles = listDirectory(history->previousPaths.at(history->historyTraversalPos), &directoryContents); - break; - default: - strcpy(error, ErrorMessages::listDirectoryError); - strcpy(currentPath, addrBarVal); - numFiles = listDirectory(std::string(currentPath), &directoryContents); - break; - } - history->isAdditionTime = false; - } else { - showError = false; - strcpy(addrBarVal, currentPath); - if(history->isAdditionTime) addPathToHistory(history, addrBarVal); - } - } - - /* - - - - - - It's renderin' time - - - - - - */ - static bool showHidden = false; - static bool filterByExtension = false; - static std::vector extensions; - - if(showError){ - ImGui::Text(error); - } - - ImGui::Text("Select a file:"); - - //Permanentes e increiblemente utilitarios botones en Cuatro K: BACK - ImGui::BeginDisabled(MIN_HISTORY_POS); - if(ImGui::Button("Back")) { - char** interfaceMovementButtonsPath = moveThroughHistory(history, HISTORY_BACKWARD); - isListDirectoriesAdequate = inputMove(&showError, interfaceMovementButtonsPath); - //TODO: ERROR - strcpy(error, ErrorMessages::moveUpError); - } - ImGui::EndDisabled(); - //FORWARD - ImGui::SameLine(); - ImGui::BeginDisabled(MAX_HISTORY_POS); - if(ImGui::Button("Forward")) { - char** interfaceMovementButtonsPath = moveThroughHistory(history, HISTORY_FORWARD); - isListDirectoriesAdequate = inputMove(&showError, interfaceMovementButtonsPath); - strcpy(error, ErrorMessages::moveUpError); - } - ImGui::EndDisabled(); - - //MOVE UP - ImGui::SameLine(); - //c pervirtio con unicode std::wstring s(L"←→↑↓"); - static char moveUp[] = ".."; - static char* moveUpPtr = &moveUp[0]; - if(ImGui::Button("Move Up")) { - isListDirectoriesAdequate = inputMove(&showError, (&moveUpPtr)); - strcpy(error, ErrorMessages::moveUpError); - history->isAdditionTime = true; - } - - ImGui::SameLine(); - //BARRA DE DIRECCIONES - ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - (ImGui::CalcTextSize("Enter").x + ImGui::GetStyle().ItemSpacing.x * 2) ); - if(ImGui::InputText("##addrbar", addrBarVal, IM_ARRAYSIZE(addrBarVal), ImGuiInputTextFlags_EnterReturnsTrue )){ - log_debugcpp(currentPath <<" ADDRBAR INTENTO"); - isListDirectoriesAdequate = inputMove(&showError, &addrBarValPtr); - handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, ErrorMessages::addrBarError, history); - }; - ImGui::PopItemWidth(); - ImGui::SameLine(); - if(ImGui::Button("Enter")){ - log_debugcpp(currentPath <<" ADDRBAR INTENTO"); - isListDirectoriesAdequate = inputMove(&showError, &addrBarValPtr); - handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, ErrorMessages::addrBarError, history); - } - //ImGui::Text("%s TEMPADDRBAR", currentPath); - - //LA GRAN TABLACIÓN: ACTOR EN LAS SOMBRAS - static ImGuiTableFlags splitterTableFlags = ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; - if (ImGui::BeginTable("##splitterTable", 2, splitterTableFlags, ImVec2(-FLT_MIN, 0.8f * ImGui::GetTextLineHeightWithSpacing()))){ - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - - //VOLUMENES - static ImGuiTableFlags volumesFlags = ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY ; - if (ImGui::BeginTable("##volumesTable", 1, volumesFlags, ImVec2(-FLT_MIN, 20 * ImGui::GetTextLineHeightWithSpacing()))){ - ImGui::TableSetupColumn("Volumes", ImGuiTableColumnFlags_NoHide); - //ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); - //ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 18.0f); - ImGui::TableHeadersRow(); - ImGui::TableNextRow(); - - if (numVolumes > 0) { - for (int i = 0; i < onPresentPaths.size(); i++) { - ImGui::TableNextColumn(); - // ImGui::PushID(i); - ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); - ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); - ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); - if(ImGui::Button(onPresentPaths.at(i))){ - isListDirectoriesAdequate = inputMove(&showError, &onPresentPaths.at(i)); - history->isAdditionTime = true; - } - ImGui::PopStyleColor(3); - if (i != onPresentPaths.size() - 1) ImGui::TableNextRow(); - // ImGui::PopID(); - } - } - ImGui::EndTable(); - } - - ImGui::TableNextColumn(); - - - //DIRECTORIOS ENCONTRADOS bien pinta2 - static ImGuiTableFlags directoriesFlags = ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable |ImGuiTableFlags_ScrollY ; - if (ImGui::BeginTable("##directoriesTable", 3, directoriesFlags, ImVec2(-FLT_MIN, 20 * ImGui::GetTextLineHeightWithSpacing()))){ - ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoHide); - ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_NoHide); - ImGui::TableSetupColumn("Size", ImGuiTableColumnFlags_NoHide); - //ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); - //ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 18.0f); - ImGui::TableHeadersRow(); - - int idx = 0; - for (; idx < numFiles; idx++) { - if(directoryContents.at(idx)->isHidden && !showHidden) continue; - if(filterByExtension && !directoryContents.at(idx)->isFile) { - //TODO XAPUSITA - extensions.clear(); - extensions.push_back("exe"); - if (!compareLastChar(&extensions, directoryContents.at(idx)->name)) continue; - } - - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - - //NAME - bool isSelected = false; - if (ImGui::Selectable(directoryContents.at(idx)->name, &isSelected)){ - strcat(addrBarVal, "\\"); - strcat(addrBarVal, directoryContents.at(idx)->name); - isListDirectoriesAdequate = inputMove(&showError, &addrBarValPtr); - handleFolderAccessResult(isListDirectoriesAdequate, currentPath, addrBarVal, error, ErrorMessages::tableElementError, history); - //currentItemIdx = -1; - } - ImGui::TableNextColumn(); - - //TYPE - if (directoryContents.at(idx)->isFile) ImGui::Text("Folder"); else ImGui::Text("File"); - ImGui::TableNextColumn(); - - //SIZE - if (!directoryContents.at(idx)->isFile) ImGui::Text("%lld bytes", directoryContents.at(idx)->size); - else ImGui::Text(""); - - //ImGui::SetItemDefaultFocus(); - - } - //DISPLAYING ALTERNATIVE INFO - if (!idx) { - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Folder is empty"); - } - ImGui::EndTable(); - } - ImGui::EndTable(); - } - - - - //ImGui::TreePop(); - - ImGui::Checkbox("Show hidden", &showHidden); - ImGui::SameLine(); - ImGui::Checkbox("Filter by .exe", &filterByExtension); - ImGui::SameLine(); - ImGui::Button("Select"); - filepickerFailure: - - - ImGui::End(); - - } - - - // 3. Show another simple window. - if (show_another_window) - { - ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) - ImGui::Text("Hello from another window!"); - if (ImGui::Button("Close Me")) - show_another_window = false; - ImGui::End(); - } - - // Rendering - ImGui::Render(); - int display_w, display_h; - glfwGetFramebufferSize(window, &display_w, &display_h); - glViewport(0, 0, display_w, display_h); - glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); - glClear(GL_COLOR_BUFFER_BIT); - ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); - - glfwSwapBuffers(window); - } - - - - - - - - - - - - - - // Cleanup - ImGui_ImplOpenGL3_Shutdown(); - ImGui_ImplGlfw_Shutdown(); - ImGui::DestroyContext(); - - glfwDestroyWindow(window); - glfwTerminate(); - - return 0; -}