From 86d04642195467d0c25ebaf50f3e1bec7789196a Mon Sep 17 00:00:00 2001 From: Tomas Rivera <137088692+Totorile1@users.noreply.github.com> Date: Mon, 30 Mar 2026 12:30:33 +0200 Subject: [PATCH] worked the base logic --- README.md | 4 ++ a.out | Bin 21936 -> 22104 bytes shell.nix | 1 + startup.c | 111 +++++++++++++++++++++++++++++++++++++----------------- 4 files changed, 82 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 0428bb6..2e3d15f 100644 --- a/README.md +++ b/README.md @@ -28,4 +28,8 @@ per vault config inside the json file a tui configurator that writes to the json an option or save in another part for backups (like periodically just put the directory you want to save in config) +a lot of options. via the config.json or via flags. +a option/flag to not render. + + later to port it to Nix diff --git a/a.out b/a.out index b01f85a35b60e3fe3773aef7293b11fdac5bade8..5c6468f846a1b74264f790156be91fb851d3d970 100755 GIT binary patch delta 6407 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 delta 5279 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 #include // for PATH_MAX #include +#include char** getVaultsFromDirectory(char *dirString, size_t *count) { // (TODO LATER) it might be a good idea to check if these directories exist @@ -48,6 +49,18 @@ char** getVaultsFromDirectory(char *dirString, size_t *count) { return dirsArray; } +int openNvim(char *path) { + printf("Opening with command nvim +:NvimTreeOpen %s\n", path); + execlp("nvim", + "nvim", // we can specify each argument for nvim by passing more args to execlp + path, + NULL); + perror("execlp failed"); + return 1; +} + + + char** getNotesFromVault(char *pathToVault, char *vault, int *count) { // this function is inputed a path to a vault (which was selected before) and outpus all the suitable notes (so not the hidden ones) printf("Opening %s aka the vault\n", vault); @@ -186,46 +199,76 @@ int main() { } else { notesDirectoryString = "~/Documents/Notes/"; // default } - size_t vaultsCount = 0; - char **vaultsArray = getVaultsFromDirectory(notesDirectoryString, &vaultsCount); - qsort(vaultsArray, vaultsCount, sizeof(const char *), compareString); // sorts the vaults alphabetically - printf("Available vaults:\n"); - for (size_t i = 0; i < vaultsCount; i++) { - printf("%s\n", vaultsArray[i]); - } - - // adds "create a new vault" into the vaultsArray - // (TODO LATER) maybe add an option for setting - const int extraOptions = 2; - vaultsArray = realloc(vaultsArray, (vaultsCount + extraOptions)*sizeof(char*)); // resize dirsArray so that - // (TODO LATER) add a way to Colorize the extraOptions - vaultsArray[vaultsCount] = "Create a new vault"; // some more options that are not vaults - vaultsArray[vaultsCount+1] = "Settings"; - // select a vault - char *vaultSelected = ncursesSelect(vaultsArray, "vault", vaultsCount + extraOptions); - printf("Selected vault:%s\n", vaultSelected); - - if (vaultSelected != "Create a new vault" || vaultSelected != "Settings") { - int filesCount = 0; - char **filesArray = getNotesFromVault(notesDirectoryString, vaultSelected, &filesCount); - qsort(filesArray, filesCount, sizeof(const char *), compareString); // sorts the notes alphabetically - // - printf("Available notes:\n"); - for (size_t i = 0; i < filesCount; i++) { - printf("%s\n", filesArray[i]); + + int shouldExit = 0; + while(!shouldExit) { + // this loop is the vault selector + size_t vaultsCount = 0; + char **vaultsArray = getVaultsFromDirectory(notesDirectoryString, &vaultsCount); + qsort(vaultsArray, vaultsCount, sizeof(const char *), compareString); // sorts the vaults alphabetically + printf("Available vaults:\n"); + for (size_t i = 0; i < vaultsCount; i++) { + printf("%s\n", vaultsArray[i]); } - char *noteSelected = ncursesSelect(filesArray, "note", filesCount); - printf("Selected note: %s", noteSelected); - } else if (vaultSelected == "Create a new vault") { + + // adds "create a new vault" into the vaultsArray + const int extraOptions = 3; + vaultsArray = realloc(vaultsArray, (vaultsCount + extraOptions)*sizeof(char*)); // resize vaultsArray to fit the extra options + // (TODO LATER) add a way to Colorize the extraOptions + vaultsArray[vaultsCount] = "Create a new vault"; // some more options that are not vaults + vaultsArray[vaultsCount+1] = "Settings"; + vaultsArray[vaultsCount+2] = "Quit (Ctrl+C)"; + // select a vault + char *vaultSelected = ncursesSelect(vaultsArray, "vault", vaultsCount + extraOptions); + printf("Selected vault:%s\n", vaultSelected); + + if (vaultSelected != "Create a new vault" && vaultSelected != "Settings" && vaultSelected != "Quit (Ctrl+C)") { + int shouldChangeVault = 0; + while (!shouldExit && !shouldChangeVault) { + // this loop is the note selector + int filesCount = 0; + char **filesArray = getNotesFromVault(notesDirectoryString, vaultSelected, &filesCount); + qsort(filesArray, filesCount, sizeof(const char *), compareString); // sorts the notes alphabetically + // + printf("Available notes:\n"); + for (size_t i = 0; i < filesCount; i++) { + printf("%s\n", filesArray[i]); + } + // adds options + int extraNotesOptions = 3; + filesArray = realloc(filesArray, (filesCount + extraNotesOptions)*sizeof(char*)); // resize filesArray to fit the extra options + filesArray[filesCount] = "Create new note"; + filesArray[filesCount+1] = "Back to vault selection"; + filesArray[filesCount+2] = "Quit (Ctrl+C)"; + char *noteSelected = ncursesSelect(filesArray, "note", filesCount + extraNotesOptions); + printf("Selected note: %s\n", noteSelected); + if (noteSelected != "Create new note" && noteSelected != "Back to vault selection" && noteSelected != "Quit (Ctrl+C)") { + char fullPath[PATH_MAX]; + sprintf(fullPath, "%s/%s/%s", notesDirectoryString, vaultSelected, noteSelected); + openNvim(fullPath); + } else if (noteSelected == "Create new note") { - } else if (vaultSelected == "Settings") { - //(TODO LATER) add a way to change the config.json from the app or at least show all the options + } else if (noteSelected == "Back to vault selection") { + shouldChangeVault = 1; + } else if (noteSelected == "Quit (Ctrl+C)") { + printf("The program was exited,\n"); + shouldExit = 1; + } + } + + } else if (vaultSelected == "Create a new vault") { + + } else if (vaultSelected == "Settings") { + //(TODO LATER) add a way to change the config.json from the app or at least show all the options + } else if (vaultSelected == "Quit (Ctrl+C)") { + printf("The program was exited.\n"); + shouldExit = 1; + } } - + // Cleanup if (dirJsonFormat && notesDirectoryString != dirJsonFormat->valuestring) free(notesDirectoryString); // only free strdup cJSON_Delete(json); free(data); - return 0; }