removed subwin
[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
13 void normal_renderstep(BoardMenu* boardmenu);
14 void popup_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     normal_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             normal_renderstep(boardmenu);
46         } else {
47             popup_handleinput(boardmenu, ch);
48             popup_renderstep(boardmenu);
49         }
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_UP:
69             menu_driver(active_menu, MENU_UP);
70             break;
71         case BINDING_SCROLL_DOWN:
72             menu_driver(active_menu, MENU_DOWN);
73             break;
74         case BINDING_SCROLL_LEFT:
75             if (boardmenu->selected-1 < 0) break;
76             set_selected_menu(boardmenu, boardmenu->selected-1);
77             break;
78         case BINDING_SCROLL_RIGHT:
79             if (boardmenu->selected+1 > boardmenu->menu_count-1) break;
80             set_selected_menu(boardmenu, boardmenu->selected+1);
81             break;
82         case BINDING_JUMP_TOP:
83             menu_driver(active_menu, MENU_TOP);
84             break;
85         case BINDING_JUMP_BOTTOM:
86             menu_driver(active_menu, MENU_BOTTOM);
87             break;
88         case BINDING_MOVE_ITEM_UP:
89             menu_driver(active_menu, MENU_MOVE_UP);
90             break;
91         case BINDING_MOVE_ITEM_DOWN:
92             menu_driver(active_menu, MENU_MOVE_DOWN);
93             break;
94         case BINDING_MOVE_ITEM_LEFT:
95             if (boardmenu->selected-1 < 0) break;
96             if (get_menu_length(boardmenu->menu_list[boardmenu->selected]) == 0) break;
97             {
98                 Menu* from_menu;
99                 Menu* to_menu;
100
101                 from_menu = boardmenu->menu_list[boardmenu->selected];
102                 to_menu = boardmenu->menu_list[boardmenu->selected-1];
103
104                 insert_item(
105                     to_menu,
106                     get_menu_item(
107                         from_menu,
108                         get_selected_item(from_menu)
109                     ),
110                     min(
111                         get_selected_item(from_menu),
112                         get_menu_length(to_menu)
113                     )
114                 );
115                 delete_item(
116                     from_menu,
117                     get_selected_item(from_menu) 
118                 );
119                 set_selected_menu(boardmenu, boardmenu->selected-1);
120             }
121
122             break;
123         case BINDING_MOVE_ITEM_RIGHT:
124             if (boardmenu->selected >= boardmenu->menu_count-1) break;
125             if (get_menu_length(boardmenu->menu_list[boardmenu->selected]) == 0) break;
126             // this is legit cpy paste please fix this
127             {
128                 Menu* from_menu;
129                 Menu* to_menu;
130
131                 from_menu = boardmenu->menu_list[boardmenu->selected];
132                 to_menu = boardmenu->menu_list[boardmenu->selected+1];
133
134                 insert_item(
135                     to_menu,
136                     get_menu_item(
137                         from_menu,
138                         get_selected_item(from_menu)
139                     ),
140                     min(
141                         get_selected_item(from_menu),
142                         get_menu_length(to_menu)
143                     )
144                 );
145                 delete_item(
146                     from_menu,
147                     get_selected_item(from_menu) 
148                 );
149                 set_selected_menu(boardmenu, boardmenu->selected+1);
150             }
151
152             break;
153         case BINDING_DELETE_ITEM:
154             menu_driver(active_menu, MENU_DELETE);
155             break;
156         case BINDING_APPEND_ITEM:
157             menu_driver(active_menu, MENU_APPEND);
158             break;
159         case BINDING_INSERT_ABOVE:
160             menu_driver(active_menu, MENU_INSERT_ABOVE);
161             break;
162         case BINDING_INSERT_BELOW:
163             menu_driver(active_menu, MENU_INSERT_BELOW);
164             break;
165         /* case BINDING_MOVE_MENU_LEFT: */
166         /*     if (boardmenu->selected-1 < 0) break; */
167
168         /*     swap_menu(boardmenu, boardmenu->selected, boardmenu->selected-1); */
169             /* boardmenu->selected -= 1; */
170             /* set_selected_menu(boardmenu, boardmenu->selected); */
171
172             /* break; */
173         /* case BINDING_MOVE_MENU_RIGHT: */
174             /* if (boardmenu->selected >= boardmenu->menu_count-1) break; */
175             /* swap_menu(boardmenu, boardmenu->selected, boardmenu->selected+1); */
176             /* boardmenu->selected += 1; */
177             /* set_selected_menu(boardmenu, boardmenu->selected); */
178
179             /* break; */
180         case BINDING_EDIT_ITEM:
181             menu_driver(active_menu, MENU_EDIT);
182             break;
183         case BINDING_SELECT:
184             {
185                 Menu* sel_menu;
186                 TodoItem* sel_itemdata;
187
188                 sel_menu = boardmenu->menu_list[boardmenu->selected];
189                 sel_itemdata = (TodoItem*)get_menuitem_userdata(
190                     get_menu_item(sel_menu, get_selected_item(sel_menu))
191                 );
192
193                 /* set mode to popup */
194                 boardmenu->popup_menu = make_popup_menu(sel_itemdata);
195                 boardmenu->popup_open = 1;
196             } 
197
198             break;
199         case BINDING_WRITE:
200             save_to_file(boardfile_name, boardmenu);
201             break;
202         case BINDING_QUIT:
203             exit_step(boardmenu);
204             break;
205         case KEY_RESIZE:
206             /* ; */
207             /* int y, x; */
208             /* char out[10]; */
209             /* getmaxyx(stdscr, y, x); */
210             /* sprintf(out, "%d,%d", y, x); */
211
212             /* mvprintw(20, 20, out); */
213             /* resize_term(y, x); */
214             break;
215     }
216 }
217
218 void
219 popup_handleinput(BoardMenu* boardmenu, int ch)
220 {
221     Menu* popup_menu;
222
223     popup_menu = boardmenu->popup_menu;
224
225     switch (ch) {
226
227         case BINDING_SCROLL_UP:
228             menu_driver(popup_menu, MENU_UP);
229             break;
230         case BINDING_SCROLL_DOWN:
231             menu_driver(popup_menu, MENU_DOWN);
232             break;
233         case BINDING_QUIT:
234             boardmenu->popup_open = 0;
235             break;
236     }    
237 }
238
239 void
240 normal_renderstep(BoardMenu* boardmenu)
241 {
242     for (int i = 0; i < boardmenu->menu_count; i++) {
243
244         Menu* curmenu = boardmenu->menu_list[i];
245
246         /* update the descriptions - maybe not do this here */ 
247         for (int j = 0; j < get_menu_length(curmenu); j++) {
248             update_menuitem_descrip(get_menu_item(curmenu, j));
249         }
250
251         render_menu(curmenu);
252     }
253 }
254
255 void
256 popup_renderstep(BoardMenu* boardmenu)
257 {
258     if (boardmenu->popup_menu == NULL) return;
259
260     render_popup_menu(boardmenu->popup_menu); 
261
262 }
263
264 void
265 save_to_file(char* filepath, BoardMenu* boardmenu)
266 {
267     Board* writeboard;
268     writeboard = boardmenu_to_board(boardmenu);
269
270     begin_write(filepath, writeboard);
271     free_board(writeboard);
272 }
273
274 void
275 exit_step(BoardMenu* boardmenu)
276 {
277     exit_tscurses();
278     exit(0);
279 }