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