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