changes in popup menu is now preserved
[taskasaur.git] / taskasaur.c
1
2 #include "headers/parser.h"
3 #include "headers/render.h"
4 #include "headers/menu.h"
5 #include "headers/utils.h"
6 #include "config.h"
7
8 char* boardfile_name = "test_board.md"; 
9
10 void normal_handleinput(BoardMenu* boardmenu, int ch);
11 void popup_handleinput(BoardMenu* boardmenu, int ch);
12 void generic_handleinput(Menu* menu, int ch);
13
14 void renderstep(BoardMenu* boardmenu);
15 void save_to_file(char* filepath, BoardMenu* boardmenu);
16
17 void exit_step(BoardMenu* boardmenu);
18
19 int
20 main(int argc, char** argv)
21 {
22     printf("%c]0;%s - %s%c", '\033', "taskasaur", boardfile_name, '\007'); // need to reset after program exits
23
24     /* read from todo file */
25     Board* board;
26     board = begin_parse(boardfile_name);
27     /* log_todo(board); */
28
29     /* init curses */
30     init_tscurses();
31
32     BoardMenu* boardmenu;
33     boardmenu = create_board_menu(board);
34
35     /* need to render before user presses anything */
36     renderstep(boardmenu);
37
38     int ch;
39     while (1) {
40
41         ch = getch();
42
43         if (boardmenu->popup_open == 0) {
44             normal_handleinput(boardmenu, ch);
45         } else {
46             popup_handleinput(boardmenu, ch);
47         }
48
49         renderstep(boardmenu);
50
51     }
52     
53     /* save on exit - this causes weird stuff to happen, maybe it's not given enough time to write before program exits? */
54     /* save_to_file(boardfile_name, boardmenu); */
55
56     return 0;    
57 }
58
59 void
60 normal_handleinput(BoardMenu* boardmenu, int ch)
61 {
62
63     Menu* active_menu;
64     active_menu = boardmenu->menu_list[boardmenu->selected];
65
66     switch (ch) {
67
68         case BINDING_SCROLL_LEFT:
69             if (boardmenu->selected-1 < 0) break;
70             set_selected_menu(boardmenu, boardmenu->selected-1);
71             break;
72         case BINDING_SCROLL_RIGHT:
73             if (boardmenu->selected+1 > boardmenu->menu_count-1) break;
74             set_selected_menu(boardmenu, boardmenu->selected+1);
75             break;
76         case BINDING_MOVE_ITEM_LEFT:
77             if (boardmenu->selected-1 < 0) break;
78             if (get_menu_length(boardmenu->menu_list[boardmenu->selected]) == 0) break;
79             {
80                 Menu* from_menu;
81                 Menu* to_menu;
82
83                 from_menu = boardmenu->menu_list[boardmenu->selected];
84                 to_menu = boardmenu->menu_list[boardmenu->selected-1];
85
86                 insert_item(
87                     to_menu,
88                     get_selected_menuitem(from_menu),
89                     min(
90                         get_selected_item(from_menu),
91                         get_menu_length(to_menu)
92                     )
93                 );
94                 delete_item(
95                     from_menu,
96                     get_selected_item(from_menu) 
97                 );
98                 set_selected_menu(boardmenu, boardmenu->selected-1);
99             }
100
101             break;
102         case BINDING_MOVE_ITEM_RIGHT:
103             if (boardmenu->selected >= boardmenu->menu_count-1) break;
104             if (get_menu_length(boardmenu->menu_list[boardmenu->selected]) == 0) break;
105             // this is legit cpy paste please fix this
106             {
107                 Menu* from_menu;
108                 Menu* to_menu;
109
110                 from_menu = boardmenu->menu_list[boardmenu->selected];
111                 to_menu = boardmenu->menu_list[boardmenu->selected+1];
112
113                 insert_item(
114                     to_menu,
115                     get_selected_menuitem(from_menu),
116                     min(
117                         get_selected_item(from_menu),
118                         get_menu_length(to_menu)
119                     )
120                 );
121                 delete_item(
122                     from_menu,
123                     get_selected_item(from_menu) 
124                 );
125                 set_selected_menu(boardmenu, boardmenu->selected+1);
126             }
127
128             break;
129         /* case BINDING_MOVE_MENU_LEFT: */
130         /*     if (boardmenu->selected-1 < 0) break; */
131
132         /*     swap_menu(boardmenu, boardmenu->selected, boardmenu->selected-1); */
133             /* boardmenu->selected -= 1; */
134             /* set_selected_menu(boardmenu, boardmenu->selected); */
135
136             /* break; */
137         /* case BINDING_MOVE_MENU_RIGHT: */
138             /* if (boardmenu->selected >= boardmenu->menu_count-1) break; */
139             /* swap_menu(boardmenu, boardmenu->selected, boardmenu->selected+1); */
140             /* boardmenu->selected += 1; */
141             /* set_selected_menu(boardmenu, boardmenu->selected); */
142
143             /* break; */
144         case BINDING_SELECT:
145             {
146                 Menu* sel_menu;
147                 TodoItem* sel_itemdata;
148
149                 sel_menu = boardmenu->menu_list[boardmenu->selected];
150                 sel_itemdata = (TodoItem*)get_menuitem_userdata(
151                     get_menu_item(sel_menu, get_selected_item(sel_menu))
152                 );
153
154                 /* set mode to popup */
155                 boardmenu->popupmenu = make_popupmenu(sel_itemdata);
156                 boardmenu->popup_open = 1;
157
158             } 
159
160             break;
161         case BINDING_WRITE:
162             save_to_file(boardfile_name, boardmenu);
163             break;
164         case BINDING_QUIT:
165             exit_step(boardmenu);
166             break;
167         case KEY_RESIZE:
168             /* ; */
169             /* int y, x; */
170             /* char out[10]; */
171             /* getmaxyx(stdscr, y, x); */
172             /* sprintf(out, "%d,%d", y, x); */
173
174             /* mvprintw(20, 20, out); */
175             /* resize_term(y, x); */
176             break;
177
178         default:
179             generic_handleinput(active_menu, ch);
180
181     }
182 }
183
184 void
185 popup_handleinput(BoardMenu* boardmenu, int ch)
186 {
187     Menu* popupmenu_menu;
188
189     popupmenu_menu = boardmenu->popupmenu->menu;
190
191     switch (ch) {
192
193         case BINDING_QUIT:
194             boardmenu->popup_open = 0;
195             close_popupmenu(popupmenu_menu);
196             
197             /* reset screen */
198             clear();
199             renderstep(boardmenu);
200             break;
201
202         case BINDING_TOGGLE_DONE:
203             {
204                 SubTask* curitem_data = (SubTask*)get_menuitem_userdata(get_menu_item(popupmenu_menu, get_selected_item(popupmenu_menu))); 
205                 curitem_data->done = (curitem_data->done == SubTaskState_todo) ? SubTaskState_done : SubTaskState_todo;
206             }
207
208             break;
209
210         default:
211             generic_handleinput(popupmenu_menu, ch);
212     }    
213 }
214
215 void
216 generic_handleinput(Menu* menu, int ch)
217 {
218     switch (ch) {
219
220         case BINDING_SCROLL_UP:
221             menu_driver(menu, MENU_UP);
222             break;
223         case BINDING_SCROLL_DOWN:
224             menu_driver(menu, MENU_DOWN);
225             break;
226         case BINDING_JUMP_TOP:
227             menu_driver(menu, MENU_TOP);
228             break;
229         case BINDING_JUMP_BOTTOM:
230             menu_driver(menu, MENU_BOTTOM);
231             break;
232         case BINDING_MOVE_ITEM_UP:
233             menu_driver(menu, MENU_MOVE_UP);
234             break;
235         case BINDING_MOVE_ITEM_DOWN:
236             menu_driver(menu, MENU_MOVE_DOWN);
237             break;
238         case BINDING_DELETE_ITEM:
239             menu_driver(menu, MENU_DELETE);
240             break;
241         case BINDING_APPEND_ITEM:
242             menu_driver(menu, MENU_APPEND);
243             break;
244         case BINDING_INSERT_ABOVE:
245             menu_driver(menu, MENU_INSERT_ABOVE);
246             break;
247         case BINDING_INSERT_BELOW:
248             menu_driver(menu, MENU_INSERT_BELOW);
249             break;
250         case BINDING_EDIT_ITEM:
251             menu_driver(menu, MENU_EDIT);
252             break;
253     }            
254 }
255
256 void
257 renderstep(BoardMenu* boardmenu)
258 {
259     /* render main board menu */
260     if (boardmenu->popup_open == 0) {
261         for (int i = 0; i < boardmenu->menu_count; i++) {
262
263             Menu* curmenu = boardmenu->menu_list[i];
264
265             render_menu(curmenu);
266         }
267
268     /* render popup if it's open */
269     } else {
270
271         // something weird happened, maybe raise error
272         /* if (boradmenu->popupmenu == NULL) return; */
273
274         render_menu(boardmenu->popupmenu->menu);
275         wrefresh(boardmenu->popupmenu->win);
276
277     }
278     refresh();
279 }
280
281 void
282 save_to_file(char* filepath, BoardMenu* boardmenu)
283 {
284     Board* writeboard;
285     writeboard = boardmenu_to_board(boardmenu);
286
287     begin_write(filepath, writeboard);
288     free_board(writeboard);
289 }
290
291 void
292 exit_step(BoardMenu* boardmenu)
293 {
294     exit_tscurses();
295     exit(0);
296 }