diff --git a/flake.lock b/flake.lock index c5e45df..5b70120 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1779560665, - "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", + "lastModified": 1786106723, + "narHash": "sha256-zDSUbpoeo/9ZmD2+wXnzxoo1+uhL8vxc0b8yuYMKYq0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", + "rev": "f13ff45afd1bb73e640eaa08a7066dbed07e3238", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index cc67480..e325d47 100644 --- a/flake.nix +++ b/flake.nix @@ -13,7 +13,7 @@ in { packages.default = pkgs.stdenv.mkDerivation (finalAttrs: { pname = "notewrapper"; - version = "v2.2.1"; + version = "v2.3.0"; src = ./.; diff --git a/src/main.c b/src/main.c index 31dc783..b9d53c5 100644 --- a/src/main.c +++ b/src/main.c @@ -642,7 +642,8 @@ backup_config_end: *backupMessage = 0; // we reset it to show the message only once - vaultSelected = ncursesSelect(vaultsArray, "Select vault to open (Use arrows or WASD, Enter to select):", vaultsCount, extraOptions, " ", "Or select an option below", "", shouldDebug); + vaultSelected = ncursesSelect(vaultsArray, "Select vault to open (Use arrows or WASD, Enter to select or use 1-9 to quick select or use 1-9 to quick select):", vaultsCount, extraOptions, " ", + "Or select an option below", "", shouldDebug); // now that we won't use vaultsArray in this iteration of the loop, we should free it and // all its elements. (As this is memory in the heap and not the stack and thus is our @@ -715,8 +716,9 @@ backup_config_end: goto note_creation; } } - noteSelected = - ncursesSelect(filesArray, "Select note or journal to open (Use arrows or WASD, Enter to select):", filesCount, extraNotesOptions, " ", "Or select an option below", "", shouldDebug); + char vaultMessage[PATH_MAX]; + snprintf(vaultMessage, PATH_MAX, "%s: Select note or journal to open (Use arrows or WASD, Enter to select or use 1-9 to quick select):", vaultSelected); + noteSelected = ncursesSelect(filesArray, vaultMessage, filesCount, extraNotesOptions, " ", "Or select an option below", "", shouldDebug); // now that we won't use filesArray in this iteration of the loop, we should free it // and all its elements. (As this is memory in the heap and not the stack and thus // is our responsability to manage) @@ -744,21 +746,30 @@ backup_config_end: int *journalWasUpdated = malloc(sizeof(int)); *journalWasUpdated = 0; + + // used to go back to note selection + int *returnNoteSelection = malloc(sizeof(int)); + *returnNoteSelection = 0; + if (!regexReturn) { // if the regex matches -> it's a journal debug("%s is a journal. Updating it...", noteSelected); - fullPath = updateJournal(fullPath, noteSelected, timeFormat, journalWasUpdated, + fullPath = updateJournal(fullPath, noteSelected, timeFormat, journalWasUpdated, returnNoteSelection, shouldDebug); // we return the path. As if it is a divided journal we // must point to the correct entry } - if (newLineOnOpening) { - if (*journalWasUpdated) { - appendToFile(fullPath, " \n", - shouldDebug); // when updating the journal it adds a \n char at the - // end. So appendToFile(\n) does not work. We append a - // (special and rare) whitespace character + \n to - // bypass this issue. + if (!*returnNoteSelection) { // if we don't need to return to the note selection + if (newLineOnOpening) { + if (*journalWasUpdated) { + appendToFile(fullPath, " \n", + shouldDebug); // when updating the journal it adds a \n char at the + // end. So appendToFile(\n) does not work. We append a + // (special and rare) whitespace character + \n to + // bypass this issue. + } + appendToFile(fullPath, "\n", shouldDebug); } - appendToFile(fullPath, "\n", shouldDebug); + openEditor(fullPath, editorToOpen, shouldRender, shouldJumpToEnd, shouldDebug); + free(fullPath); } openEditor(fullPath, editorToOpen, shouldRender, shouldJumpToEnd, shouldDebug); if (gitEnabled) { // After closing a file, we need to update the git repo (if git is enable @@ -790,7 +801,7 @@ backup_config_end: const char *yesNo[] = {"No, go back to note selection.", "Yes."}; char *answer = ncursesSelect((char **)yesNo, "Are you sure you want to delete the entire vault? This can " - "not be undone (Use arrows or WASD, Enter to select):", + "not be undone (Use arrows or WASD, Enter to select or use 1-9 to quick select):", 1, 1, " ", "", "", shouldDebug); debug("You answered: %s for deleting the vault %s", answer, vaultSelected); if (strcmp(answer, "Yes.") == 0) { diff --git a/src/notes.c b/src/notes.c index f6ebf5f..a9d8d33 100644 --- a/src/notes.c +++ b/src/notes.c @@ -188,7 +188,7 @@ char **getVaultsFromDirectories(char **directoryStringArray, int directoryNumber return vaultsArray; } -char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int shouldDebug) { +char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int *returnNoteSelection, int shouldDebug) { path[PATH_MAX] = '\0'; // it assures it is a string (Most cases this does nothing). But rewriting at least // one bytes make the compile happy. He doesn't want to return an unchanged input. debug("Handling the journal %s", path); @@ -221,13 +221,14 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas that the Create new entry in journal is on top entryArray = realloc(entryArray, sizeof(char*));*/ // simpler to just malloc 2 and later realloc - const int extraOptions = 3; + const int extraOptions = 4; char **entryArray = malloc(extraOptions * sizeof(char *)); char *createEntryMessage = malloc(PATH_MAX); snprintf(createEntryMessage, PATH_MAX, "Create new entry for the journal %s", journal); entryArray[0] = createEntryMessage; entryArray[1] = "Open random entry"; entryArray[2] = "Search inside entries"; + entryArray[3] = "Return to the note selection"; int entryCount = extraOptions; // we need to count how many dirs there is to always readjust // how many memory we alloc // Refer https://pubs.opengroup.org/onlinepubs/7990989775/xsh/readdir.html @@ -259,10 +260,11 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas // element // we must now select to create new entry or to enter in old one - char *selectedOption = ncursesSelect(entryArray, "Create new entry or acces old entry (Use arrows or WASD, Enter to select):", extraOptions, entryCount - extraOptions, " ", " ", "", - shouldDebug); // the "Create new entry for the journal %s" will be the only options. All - // other will be extraOptions. This is made so that "Create [...] %s" will - // always be on top + char *selectedOption = + ncursesSelect(entryArray, "Create new entry or acces old entry (Use arrows or WASD, Enter to select or use 1-9 to quick select):", extraOptions, entryCount - extraOptions, " ", " ", "", + shouldDebug); // the "Create new entry for the journal %s" will be the only options. All + // other will be extraOptions. This is made so that "Create [...] %s" will + // always be on top debug("Selected option from journal entry selection: %s", selectedOption); if (strcmp(selectedOption, createEntryMessage) == 0) { // create new entry char temp[PATH_MAX]; @@ -301,6 +303,8 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas snprintf(selectedOption, PATH_MAX, "%s/%s", path, temp); path = strdup(selectedOption); free(selectedOption); + } else if (strcmp(selectedOption, "Return to the note selection") == 0) { + *returnNoteSelection = 1; } else { // we just recreate the path to the selected entry // snprintf does not like to have the same variable as input and output so we use a // buffer diff --git a/src/notes.h b/src/notes.h index f9a1747..8538ce2 100644 --- a/src/notes.h +++ b/src/notes.h @@ -25,6 +25,7 @@ char **getVaultsFromDirectories(char **directoryStringArray, int directoryNumber // handles both type of journal (divided and unified). // creates new entry with date. // for divided select if we want to acces to a new entry or a old one. +// returnNoteSelection tells us if the user wants to go back to the note selection. // returns the path to the file that needs to be opened. -char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int shouldDebug); +char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int *returnNoteSelection, int shouldDebug); #endif diff --git a/src/ui.c b/src/ui.c index 653f6f1..f4fe9ac 100644 --- a/src/ui.c +++ b/src/ui.c @@ -6,7 +6,8 @@ void createNewVault(char **directoriesArray, int directoryCount, char **vaultsAr int emptyWarning = 0; // set to 1 later if inpted empty name input_screen: // choose in which directory the vault will be created - char *dirToVault = ncursesSelect(directoriesArray, "Select a directory, in which the vault will remain (Use arrows or WASD, Enter to select)", directoryCount, 0, "", "", " ", shouldDebug); + char *dirToVault = + ncursesSelect(directoriesArray, "Select a directory, in which the vault will remain (Use arrows or WASD, Enter to select or use 1-9 to quick select)", directoryCount, 0, "", "", " ", shouldDebug); char *vaultName = malloc(PATH_MAX); if (!bypass) { // if won't bypass (if -v or --vault weren't set) echo(); @@ -309,6 +310,69 @@ char *ncursesSelect(char **options, char *optionsText, int optionsNumber, int ex highlight = 0; } break; + case '1': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 1."); + highlight = 0; + goto end_loop; + } + break; + case '2': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 2."); + highlight = 1; + goto end_loop; + } + break; + case '3': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 3."); + highlight = 2; + goto end_loop; + } + break; + case '4': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 4."); + highlight = 3; + goto end_loop; + } + break; + case '5': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 5."); + highlight = 4; + goto end_loop; + } + break; + case '6': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 6."); + highlight = 5; + goto end_loop; + } + break; + case '7': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 7."); + highlight = 6; + goto end_loop; + } + break; + case '8': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 8."); + highlight = 7; + goto end_loop; + } + break; + case '9': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 9."); + highlight = 8; + goto end_loop; + } + break; case 10: //\n goto end_loop; }