insert/text editing
authorDaniel Liu <mr.picklepinosaur@gmail.com>
Sun, 7 Feb 2021 04:09:16 +0000 (23:09 -0500)
committerDaniel Liu <mr.picklepinosaur@gmail.com>
Sun, 7 Feb 2021 04:09:16 +0000 (23:09 -0500)
config.h
headers/menu.h
headers/render.h
menu.c
render.c
taskasaur.c

index 7fbd972..7960e1e 100644 (file)
--- a/config.h
+++ b/config.h
@@ -37,5 +37,7 @@ static int menu_non_selected_color = COLOR_GREEN;
 #define BINDING_DELETE_ITEM 'D'
 #define BINDING_SELECT '\n'
 #define BINDING_APPEND_ITEM 'a'
+#define BINDING_INSERT_ABOVE 'O'
+#define BINDING_INSERT_BELOW 'o'
 
 #endif
index f1bac0e..b8ab467 100644 (file)
@@ -16,7 +16,9 @@ typedef enum {
     MENU_MOVE_UP,
     MENU_MOVE_DOWN,
     MENU_DELETE,
-    MENU_APPEND
+    MENU_APPEND,
+    MENU_INSERT_ABOVE,
+    MENU_INSERT_BELOW
 } MenuAction;
 
 typedef struct Menu Menu;
index 453c525..5a13100 100644 (file)
@@ -18,4 +18,8 @@ extern int exit_tscurses(void);
 extern int curs_on(void);
 extern int curs_off(void);
 
+/* some helpers */
+extern int ungetstr(char* str);
+
+
 #endif
diff --git a/menu.c b/menu.c
index 71bb5a0..eb6d7dc 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -37,6 +37,9 @@ int swap_item(Menu* menu, int src_index, int dest_index);
 int delete_item(Menu* menu, int index);
 int insert_item(Menu* menu, int index);
 
+/* insert mode */
+int menu_insert_mode(Menu* menu, int insert_index);
+
 MenuItem*
 create_menuitem(char* contents)
 {
@@ -165,7 +168,7 @@ insert_item(Menu* menu, int index)
 
     // remember null char
     /* new_content = malloc((MAX_CONTENTS_LENGTH+1)*sizeof(char)); */ 
-    new_content = strdup("lmao");
+    new_content = strdup("");
 
     new_menuitem = create_menuitem(new_content);
 
@@ -186,6 +189,35 @@ insert_item(Menu* menu, int index)
     return 0;
 }
 
+int
+menu_insert_mode(Menu* menu, int insert_index)
+{
+    char temp[MAX_CONTENTS_LENGTH+1]; // remember null
+    char* new_contents;
+
+    /* this is bad */
+    wclear(menu->sub_win);
+    render_menu(menu);
+
+    curs_on();
+
+    /* move cursor to right spot */
+    ungetstr(menu->menu_items[insert_index]->contents);
+    mvwgetnstr(menu->sub_win,
+        insert_index, // account for wrap later too
+        0,
+        temp,
+        MAX_CONTENTS_LENGTH
+    );
+    curs_off();
+
+    /* copy out */
+    new_contents = strdup(temp);
+    menu->menu_items[insert_index]->contents = new_contents;
+
+    return 0;
+}
+
 int
 menu_driver(Menu* menu, MenuAction action)
 {
@@ -225,11 +257,24 @@ menu_driver(Menu* menu, MenuAction action)
             break;
 
         case MENU_APPEND:
-            /* curs_on(); */
-            /* curs_off(); */
-            /* insert_item(menu, menu->selected_item); */
-            insert_item(menu, menu->selected_item);
+            insert_item(menu, menu->menu_length);
+            wclear(menu->sub_win);
+            break;
+
+        case MENU_INSERT_ABOVE:
+            ;
+            int insert_ind = menu->selected_item;
+            insert_item(menu, insert_ind);
+            menu_insert_mode(menu, insert_ind);
+
+            break;
+
+        case MENU_INSERT_BELOW:
+            insert_item(menu,
+                (menu->selected_item >= menu->menu_length-1) ? menu->menu_length : menu->selected_item+1
+            );
             wclear(menu->sub_win);
+
             break;
 
         default: // This is here for debug, disable later
index b0fb21a..ebaec93 100644 (file)
--- a/render.c
+++ b/render.c
@@ -1,5 +1,6 @@
 
 #include "headers/render.h"
+#include <string.h>
 #include "config.h"
 
 int init_tscolors(void);
@@ -76,3 +77,14 @@ create_todowin(void)
     return 0;
 }
 
+int
+ungetstr(char* str)
+{
+    // ignore null character (it's fine even if strlen = 0)
+    for (int i = strlen(str)-1; i >= 0; i--) {
+        ungetch(str[i]);
+    }
+
+    return 0; 
+}
+
index c9bddb8..b317c9a 100644 (file)
@@ -76,6 +76,12 @@ main(int argc, char** argv)
             case BINDING_APPEND_ITEM:
                 menu_driver(active_menu, MENU_APPEND);
                 break;
+            case BINDING_INSERT_ABOVE:
+                menu_driver(active_menu, MENU_INSERT_ABOVE);
+                break;
+            case BINDING_INSERT_BELOW:
+                menu_driver(active_menu, MENU_INSERT_BELOW);
+                break;
         }
 
         for (int i = 0; i < boardmenu->menu_count; i++) {