From e731a0110ad0fe42b0c980d237c065d9e3aec3d6 Mon Sep 17 00:00:00 2001 From: Tomas Rivera <137088692+Totorile1@users.noreply.github.com> Date: Wed, 1 Apr 2026 09:47:37 +0200 Subject: [PATCH] Updated ncursesSelect colors --- README.md | 3 ++- startup.c | 51 ++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 92de946..0ee3458 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,8 @@ git clone https://github.com/Totorile1/NoteWrapper.git cd NoteWrapper make ``` -4. run the binary `notewrapper` +4. configure `./config.json` +5. run the binary `notewrapper` ### What needs to be done (a lot) - [x] Add a way to create vaults diff --git a/startup.c b/startup.c index 62d95cb..4870b63 100644 --- a/startup.c +++ b/startup.c @@ -62,7 +62,7 @@ char *createNewNote(char dirToVault[PATH_MAX], char *vaultFromDir, int debug) { endwin(); // (TODO LATER) add a way to go back to note selection if (strcmp(fileName, "") == 0) { - printf("\e[0;32mERROR: fileName is empty\e[0m\n"); + printf("\e[0;32mERROR: fileName is empty\e[0m\n"); // (TODO LATER) it should just go back to the note creation with a warning exit(1); } // check/sanitize the input @@ -223,21 +223,34 @@ char** getNotesFromVault(char *pathToVault, char *vault, int *count, int debug) return notesArray; } -char* ncursesSelect(char **options, char *optionsText, size_t optionsNumber, int debug) { // this fonction make a TUI to select one of multiple options. +char* ncursesSelect(char **options, char *optionsText, size_t optionsNumber, int extraOptionsNumber, int debug) { + // this function is used multiple times let the user select one options from many. + // options is the array of strings with all the options. + // one of this option will be returned + // optionsText is the text that will be printed at the top (For example: "Please select ...") + // we distinguish options from extraOptions + // options could be the list of all notes or all vaults + // extraOptions are options that are special and have a special color (for ex: "Delete vault", "Settings", etc.) + // note: extraOptions should be at the end of options + int highlight = 0; //curently highlighted option - int choice = 1; //selected index int key; initscr(); //initialize ncurses cbreak(); // disable line buffering noecho(); // don't echo key presses keypad(stdscr, TRUE); // enable arrow keys + start_color(); + curs_set(0); // sets the cursor to invisible. (We will emulate the cursor with a hightlight that go up and down). + use_default_colors(); //(TODO LATER) customize these colors in the config file + init_pair(1, COLOR_WHITE, -1); // color for optionsNumber (so notes, vaults, etc.) + init_pair(2, COLOR_BLUE, -1); // color for extraOptionsNumber (so settings, delete notes, create vault, etc.) while (1) { clear(); + attron(COLOR_PAIR(1)); mvprintw(0,0, "Select %s (Use arrows or WASD, Enter to select):", optionsText); - - // Print options with highlighting - for(int i = 0; i < optionsNumber; i++) { + // Print options with highlighting + for (int i = 0; i < optionsNumber; i++) { if (i == highlight) { attron(A_REVERSE); } // highlight selected @@ -246,6 +259,19 @@ char* ncursesSelect(char **options, char *optionsText, size_t optionsNumber, int attroff(A_REVERSE); } } + attroff(COLOR_PAIR(1)); + // Printf extraOptions with highlighting + attron(COLOR_PAIR(2)); + for (int k = optionsNumber; k < optionsNumber + extraOptionsNumber; k++) { + if (k == highlight) { + attron(A_REVERSE); + } + mvprintw(k+2, 2, "%s", options[k]); + if (k == highlight) { + attroff(A_REVERSE); + } + } + attroff(COLOR_PAIR(2)); key = getch(); //get some int which value correspond to some key being pressed switch(key) { @@ -254,25 +280,24 @@ char* ncursesSelect(char **options, char *optionsText, size_t optionsNumber, int case 'W': highlight--; if (highlight < 0) { - highlight = optionsNumber - 1;// can't select the -1nth option + highlight = optionsNumber + extraOptionsNumber - 1;// can't select the -1nth option } break; case 's': case 'S': case KEY_DOWN: highlight++; - if (highlight >= optionsNumber) { + if (highlight >= optionsNumber + extraOptionsNumber) { highlight = 0; } break; case 10: //\n - choice = highlight; goto end_loop; } } end_loop: endwin(); // end ncurses mode - return options[choice]; + return options[highlight]; } @@ -376,7 +401,7 @@ int main(int argc, char *argv[]) { vaultsArray[vaultsCount+1] = "Settings"; vaultsArray[vaultsCount+2] = "Quit (Ctrl+C)"; // select a vault - char *vaultSelected = ncursesSelect(vaultsArray, "Select vault (Use arrows or WASD, Enter to select):", vaultsCount + extraOptions, debug); + char *vaultSelected = ncursesSelect(vaultsArray, "Select vault (Use arrows or WASD, Enter to select):", vaultsCount, extraOptions, debug); if (debug) {printf("\e[0;32m[DEBUG]\e[0m Selected vault:%s\n", vaultSelected);} if (strcmp(vaultSelected,"Create a new vault") != 0 && strcmp(vaultSelected,"Settings") != 0 && strcmp(vaultSelected,"Quit (Ctrl+C)") != 0) { @@ -401,7 +426,7 @@ int main(int argc, char *argv[]) { filesArray[filesCount+1] = "Back to vault selection"; filesArray[filesCount+2] = "Delete vault"; filesArray[filesCount+3] = "Quit (Ctrl+C)"; - char *noteSelected = ncursesSelect(filesArray, "Select note (Use arrows or WASD, Enter to select):", filesCount + extraNotesOptions, debug); + char *noteSelected = ncursesSelect(filesArray, "Select note (Use arrows or WASD, Enter to select):", filesCount, extraNotesOptions, debug); if (debug) {printf("\e[0;32m[DEBUG]\e[0m Selected note: %s\n", noteSelected);} if (strcmp(noteSelected, "Create new note") != 0 && strcmp(noteSelected,"Back to vault selection") != 0 && strcmp(noteSelected, "Delete vault") != 0 && strcmp(noteSelected,"Quit (Ctrl+C)") != 0) { @@ -416,7 +441,7 @@ int main(int argc, char *argv[]) { shouldChangeVault = 1; } else if (strcmp(noteSelected, "Delete vault") == 0) { 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.", 2, debug); + char *answer = ncursesSelect((char **)yesNo, "Are you sure you want to delete the entire vault? This can not be undone.", 1, 1, debug); if (debug) {printf("\e[0;32m[DEBUG]\e[0mYou answered: \e[0;32m%s\e[0m for deleting the vault named \e[0;32m%s\e[0m\n", answer, vaultSelected);} if (strcmp(answer, "Yes.") == 0) { // delete the vault after confirmation by the user