changes in popup menu is now preserved
[taskasaur.git] / taskasaur.c
index 62adc7d..c7c224f 100644 (file)
@@ -9,9 +9,9 @@ char* boardfile_name = "test_board.md";
 
 void normal_handleinput(BoardMenu* boardmenu, int ch);
 void popup_handleinput(BoardMenu* boardmenu, int ch);
+void generic_handleinput(Menu* menu, int ch);
 
-void normal_renderstep(BoardMenu* boardmenu);
-void popup_renderstep(BoardMenu* boardmenu);
+void renderstep(BoardMenu* boardmenu);
 void save_to_file(char* filepath, BoardMenu* boardmenu);
 
 void exit_step(BoardMenu* boardmenu);
@@ -33,21 +33,21 @@ main(int argc, char** argv)
     boardmenu = create_board_menu(board);
 
     /* need to render before user presses anything */
-    normal_renderstep(boardmenu);
+    renderstep(boardmenu);
 
     int ch;
     while (1) {
-        
+
         ch = getch();
 
         if (boardmenu->popup_open == 0) {
             normal_handleinput(boardmenu, ch);
-            normal_renderstep(boardmenu);
         } else {
             popup_handleinput(boardmenu, ch);
-            popup_renderstep(boardmenu);
         }
 
+        renderstep(boardmenu);
+
     }
     
     /* save on exit - this causes weird stuff to happen, maybe it's not given enough time to write before program exits? */
@@ -65,12 +65,6 @@ normal_handleinput(BoardMenu* boardmenu, int ch)
 
     switch (ch) {
 
-        case BINDING_SCROLL_UP:
-            menu_driver(active_menu, MENU_UP);
-            break;
-        case BINDING_SCROLL_DOWN:
-            menu_driver(active_menu, MENU_DOWN);
-            break;
         case BINDING_SCROLL_LEFT:
             if (boardmenu->selected-1 < 0) break;
             set_selected_menu(boardmenu, boardmenu->selected-1);
@@ -79,18 +73,6 @@ normal_handleinput(BoardMenu* boardmenu, int ch)
             if (boardmenu->selected+1 > boardmenu->menu_count-1) break;
             set_selected_menu(boardmenu, boardmenu->selected+1);
             break;
-        case BINDING_JUMP_TOP:
-            menu_driver(active_menu, MENU_TOP);
-            break;
-        case BINDING_JUMP_BOTTOM:
-            menu_driver(active_menu, MENU_BOTTOM);
-            break;
-        case BINDING_MOVE_ITEM_UP:
-            menu_driver(active_menu, MENU_MOVE_UP);
-            break;
-        case BINDING_MOVE_ITEM_DOWN:
-            menu_driver(active_menu, MENU_MOVE_DOWN);
-            break;
         case BINDING_MOVE_ITEM_LEFT:
             if (boardmenu->selected-1 < 0) break;
             if (get_menu_length(boardmenu->menu_list[boardmenu->selected]) == 0) break;
@@ -103,10 +85,7 @@ normal_handleinput(BoardMenu* boardmenu, int ch)
 
                 insert_item(
                     to_menu,
-                    get_menu_item(
-                        from_menu,
-                        get_selected_item(from_menu)
-                    ),
+                    get_selected_menuitem(from_menu),
                     min(
                         get_selected_item(from_menu),
                         get_menu_length(to_menu)
@@ -133,10 +112,7 @@ normal_handleinput(BoardMenu* boardmenu, int ch)
 
                 insert_item(
                     to_menu,
-                    get_menu_item(
-                        from_menu,
-                        get_selected_item(from_menu)
-                    ),
+                    get_selected_menuitem(from_menu),
                     min(
                         get_selected_item(from_menu),
                         get_menu_length(to_menu)
@@ -149,18 +125,6 @@ normal_handleinput(BoardMenu* boardmenu, int ch)
                 set_selected_menu(boardmenu, boardmenu->selected+1);
             }
 
-            break;
-        case BINDING_DELETE_ITEM:
-            menu_driver(active_menu, MENU_DELETE);
-            break;
-        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;
         /* case BINDING_MOVE_MENU_LEFT: */
         /*     if (boardmenu->selected-1 < 0) break; */
@@ -177,9 +141,6 @@ normal_handleinput(BoardMenu* boardmenu, int ch)
             /* set_selected_menu(boardmenu, boardmenu->selected); */
 
             /* break; */
-        case BINDING_EDIT_ITEM:
-            menu_driver(active_menu, MENU_EDIT);
-            break;
         case BINDING_SELECT:
             {
                 Menu* sel_menu;
@@ -193,6 +154,7 @@ normal_handleinput(BoardMenu* boardmenu, int ch)
                 /* set mode to popup */
                 boardmenu->popupmenu = make_popupmenu(sel_itemdata);
                 boardmenu->popup_open = 1;
+
             } 
 
             break;
@@ -212,6 +174,10 @@ normal_handleinput(BoardMenu* boardmenu, int ch)
             /* mvprintw(20, 20, out); */
             /* resize_term(y, x); */
             break;
+
+        default:
+            generic_handleinput(active_menu, ch);
+
     }
 }
 
@@ -222,42 +188,94 @@ popup_handleinput(BoardMenu* boardmenu, int ch)
 
     popupmenu_menu = boardmenu->popupmenu->menu;
 
+    switch (ch) {
+
+        case BINDING_QUIT:
+            boardmenu->popup_open = 0;
+            close_popupmenu(popupmenu_menu);
+            
+            /* reset screen */
+            clear();
+            renderstep(boardmenu);
+            break;
+
+        case BINDING_TOGGLE_DONE:
+            {
+                SubTask* curitem_data = (SubTask*)get_menuitem_userdata(get_menu_item(popupmenu_menu, get_selected_item(popupmenu_menu))); 
+                curitem_data->done = (curitem_data->done == SubTaskState_todo) ? SubTaskState_done : SubTaskState_todo;
+            }
+
+            break;
+
+        default:
+            generic_handleinput(popupmenu_menu, ch);
+    }    
+}
+
+void
+generic_handleinput(Menu* menu, int ch)
+{
     switch (ch) {
 
         case BINDING_SCROLL_UP:
-            menu_driver(popupmenu_menu, MENU_UP);
+            menu_driver(menu, MENU_UP);
             break;
         case BINDING_SCROLL_DOWN:
-            menu_driver(popupmenu_menu, MENU_DOWN);
+            menu_driver(menu, MENU_DOWN);
             break;
-        case BINDING_QUIT:
-            boardmenu->popup_open = 0;
+        case BINDING_JUMP_TOP:
+            menu_driver(menu, MENU_TOP);
             break;
-    }    
+        case BINDING_JUMP_BOTTOM:
+            menu_driver(menu, MENU_BOTTOM);
+            break;
+        case BINDING_MOVE_ITEM_UP:
+            menu_driver(menu, MENU_MOVE_UP);
+            break;
+        case BINDING_MOVE_ITEM_DOWN:
+            menu_driver(menu, MENU_MOVE_DOWN);
+            break;
+        case BINDING_DELETE_ITEM:
+            menu_driver(menu, MENU_DELETE);
+            break;
+        case BINDING_APPEND_ITEM:
+            menu_driver(menu, MENU_APPEND);
+            break;
+        case BINDING_INSERT_ABOVE:
+            menu_driver(menu, MENU_INSERT_ABOVE);
+            break;
+        case BINDING_INSERT_BELOW:
+            menu_driver(menu, MENU_INSERT_BELOW);
+            break;
+        case BINDING_EDIT_ITEM:
+            menu_driver(menu, MENU_EDIT);
+            break;
+    }            
 }
 
 void
-normal_renderstep(BoardMenu* boardmenu)
+renderstep(BoardMenu* boardmenu)
 {
-    for (int i = 0; i < boardmenu->menu_count; i++) {
+    /* render main board menu */
+    if (boardmenu->popup_open == 0) {
+        for (int i = 0; i < boardmenu->menu_count; i++) {
 
-        Menu* curmenu = boardmenu->menu_list[i];
+            Menu* curmenu = boardmenu->menu_list[i];
 
-        /* update the descriptions - maybe not do this here */ 
-        for (int j = 0; j < get_menu_length(curmenu); j++) {
-            update_menuitem_descrip(get_menu_item(curmenu, j));
+            render_menu(curmenu);
         }
 
-        render_menu(curmenu);
-    }
-}
+    /* render popup if it's open */
+    } else {
 
-void
-popup_renderstep(BoardMenu* boardmenu)
-{
-    if (boardmenu->popupmenu == NULL) return;
+        // something weird happened, maybe raise error
+        /* if (boradmenu->popupmenu == NULL) return; */
 
-    render_popupmenu(boardmenu->popupmenu); 
+        render_menu(boardmenu->popupmenu->menu);
+        wrefresh(boardmenu->popupmenu->win);
+
+    }
+    refresh();
 }
 
 void