1 /* Signal Processing - Filter Menu
2 
3  * Copyright (C) 1998 J.A. Bezemer
4  *
5  * Licensed under the terms of the GNU General Public License.
6  * ABSOLUTELY NO WARRANTY.
7  * See the file `COPYING' in this directory.
8  */
9 
10 #include "signpr_filtmenu.h"
11 #include "signpr_general.h"
12 #include "buttons.h"
13 #include "boxes.h"
14 #include "helpline.h"
15 #include "clrscr.h"
16 #include "errorwindow.h"
17 #include "stringinput.h"
18 #include "secshms.h"
19 #include <stdlib.h>
20 #include <string.h>
21 #ifndef OLD_CURSES
22 #include <ncurses.h>
23 #else
24 #include <curses.h>
25 #endif
26 
27 
28 int
signproc_select_filters(scrollmenu_t * filtlist,int * filtnumbers,char ** helptexts,scrollmenu_t * selectedfilts,int * usetracktimes,int * usebeginendtime,double * begintime,double * endtime)29 signproc_select_filters (scrollmenu_t * filtlist,
30 			 int *filtnumbers,
31 			 char **helptexts,
32 			 scrollmenu_t * selectedfilts,
33 			 int *usetracktimes, int *usebeginendtime,
34 			 double *begintime, double *endtime)
35 /* Returns 0: canceled, 1: PrevScreen, 2: NextScreen */
36 {
37   button_t next_button, cancel_button, prev_button;
38   button_t beginend_check, tracktimes_check;
39   stringinput_t begintimestring, endtimestring;
40   int dont_stop = TRUE;
41   int returnval = 0;
42   int focus = 0;
43   int in_ch;
44   int i;
45   double tempdouble = 0;
46   char tempstring[250];
47 
48   char *emptyhelpline =
49   "                                                                TAB: Next field";
50 
51   int maxhelplength = 62;
52   char helphelpline[100];
53 
54   char *helplines[9] =
55   {
56     " Enter: Add selected filter.                                    TAB: Next field",
57     " Enter: Parameters   U/D: Move   R/Del: Delete                  TAB: Next field",
58     " Use the .tracks file to split tracks.                          TAB: Next field",
59     " Process only the specified part of the sound.                  TAB: Next field",
60     " Enter begin time of part to be processed.                      TAB: Next field",
61     " Enter end time of part to be processed.                        TAB: Next field",
62     " To Signal Processing - Source File.                            TAB: Next field",
63     " Back to main menu.                                             TAB: Next field",
64     " To Signal Processing - Destination File.                       TAB: Next field"};
65 
66   char *helpcharptr;
67   int helpint;
68   parampointer_t helpparampointer;
69 
70 
71   filtlist->y = 3;
72   filtlist->x = 5;
73   filtlist->h = 12;
74   filtlist->w = 32;
75   filtlist->firstonscreen = 0;
76   filtlist->selected = 0;
77 
78   selectedfilts->y = 3;
79   selectedfilts->x = 43;
80   selectedfilts->h = 12;
81   selectedfilts->w = 32;
82   selectedfilts->firstonscreen = 0;
83   selectedfilts->selected = 0;
84 
85 
86   begintimestring.maxlen = 500;
87   begintimestring.string = (char *) malloc (
88 				    begintimestring.maxlen * sizeof (char));
89   fsec2hmsf (*begintime, begintimestring.string);
90   begintimestring.y = 17;
91   begintimestring.x = 59;
92   begintimestring.w = 18;
93   begintimestring.cursorpos = strlen (begintimestring.string);
94   begintimestring.firstcharonscreen = 0;
95 
96   endtimestring.maxlen = 500;
97   endtimestring.string = (char *) malloc (
98 				      endtimestring.maxlen * sizeof (char));
99   fsec2hmsf (*endtime, endtimestring.string);
100   endtimestring.y = 18;
101   endtimestring.x = 59;
102   endtimestring.w = 18;
103   endtimestring.cursorpos = strlen (endtimestring.string);
104   endtimestring.firstcharonscreen = 0;
105 
106   prev_button.text = " < Previous screen ";
107   prev_button.y = 20;
108   prev_button.x = 5;
109   prev_button.selected = FALSE;
110 
111   next_button.text = " Next screen > ";
112   next_button.y = 20;
113   next_button.x = 60;
114   next_button.selected = FALSE;
115 
116   cancel_button.text = " Cancel ";
117   cancel_button.y = 20;
118   cancel_button.x = 36;
119   cancel_button.selected = FALSE;
120 
121   tracktimes_check.text = "";	/* see below */
122   tracktimes_check.y = 16;
123   tracktimes_check.x = 4;
124   tracktimes_check.selected = FALSE;
125 
126   beginend_check.text = "";	/* see below */
127   beginend_check.y = 16;
128   beginend_check.x = 42;
129   beginend_check.selected = FALSE;
130 
131   clearscreen (SIGNPR_FILTMENU_HEADERTEXT);
132 
133   do
134     {
135       header (SIGNPR_FILTMENU_HEADERTEXT);
136 
137       if (*usetracktimes)
138 	tracktimes_check.text = "[X] Split tracks";
139       else
140 	tracktimes_check.text = "[ ] Split tracks";
141 
142       if (*usebeginendtime)
143 	beginend_check.text = "[X] Use begin and end times";
144       else
145 	beginend_check.text = "[ ] Use begin and end times";
146 
147       if (focus == 2)
148 	tracktimes_check.selected = TRUE;
149       else
150 	tracktimes_check.selected = FALSE;
151 
152       if (focus == 3)
153 	beginend_check.selected = TRUE;
154       else
155 	beginend_check.selected = FALSE;
156 
157       if (focus == 6)
158 	prev_button.selected = TRUE;
159       else
160 	prev_button.selected = FALSE;
161 
162       if (focus == 7)
163 	cancel_button.selected = TRUE;
164       else
165 	cancel_button.selected = FALSE;
166 
167       if (focus == 8)
168 	next_button.selected = TRUE;
169       else
170 	next_button.selected = FALSE;
171 
172       filtlist->hasfocus = (focus == 0);
173       selectedfilts->hasfocus = (focus == 1);
174 
175       scrollmenu_display (filtlist);
176       mybox (filtlist->y - 1, filtlist->x - 1,
177 	     filtlist->h + 2, filtlist->w + 2);
178       mvprintw (filtlist->y - 1, filtlist->x + 1,
179 		"Available filters:");
180 
181       scrollmenu_display (selectedfilts);
182       mybox (selectedfilts->y - 1, selectedfilts->x - 1,
183 	     selectedfilts->h + 2, selectedfilts->w + 2);
184       mvprintw (selectedfilts->y - 1, selectedfilts->x + 1,
185 		"Selected filters:");
186 
187       stringinput_display (&begintimestring);
188       mvprintw (begintimestring.y, begintimestring.x - 12,
189 		"Begin time:");
190 
191       stringinput_display (&endtimestring);
192       mvprintw (endtimestring.y, endtimestring.x - 12,
193 		"End time  :");
194 
195       button_display (&prev_button);
196       mybox (prev_button.y - 1, prev_button.x - 1,
197 	     3, strlen (prev_button.text) + 2);
198       button_display (&cancel_button);
199       mybox (cancel_button.y - 1, cancel_button.x - 1,
200 	     3, strlen (cancel_button.text) + 2);
201       button_display (&next_button);
202       mybox (next_button.y - 1, next_button.x - 1,
203 	     3, strlen (next_button.text) + 2);
204 
205       button_display (&tracktimes_check);
206       button_display (&beginend_check);
207 
208       if (focus == 0)
209 	{
210 	  strcpy (helphelpline, emptyhelpline);
211 
212 	  i = 0;
213 	  while (i < strlen (helptexts[filtlist->selected])
214 		 && i < maxhelplength)
215 	    {
216 	      helphelpline[i + 1] = helptexts[filtlist->selected][i];
217 	      i++;
218 	    }
219 
220 	  helpline (helphelpline);
221 	}
222       else
223 	helpline (helplines[focus]);
224 
225       if (focus == 4)
226 	stringinput_display (&begintimestring);
227       else if (focus == 5)
228 	stringinput_display (&endtimestring);
229       else
230 	move (0, 79);
231 
232       refresh ();
233 
234       in_ch = getch ();
235 
236       switch (focus)
237 	{
238 	case 0:		/* filtlist */
239 	  if (scrollmenu_stdkeys (in_ch, filtlist) >= 0)
240 	    {
241 	      if (selectedfilts->number < MAX_FILTERS)
242 		{
243 		  selectedfilts->items[number_of_filters] =
244 		    filtlist->items[filtlist->selected];
245 		  filter_type[number_of_filters] =
246 		    filtnumbers[filtlist->selected];
247 		  parampointerarray[number_of_filters] =
248 		    (parampointer_t) malloc (
249 					      sizeof (param_t));
250 		  param_defaults (
251 				   parampointerarray[number_of_filters],
252 				   filtnumbers[filtlist->selected]);
253 		  number_of_filters++;
254 		  selectedfilts->number = number_of_filters;
255 		  selectedfilts->selected = number_of_filters - 1;
256 		}
257 	      else
258 		error_window ("The maximum number of filters has been \
259 reached. No more filters can be added.");
260 	    }
261 	  else
262 	    switch (in_ch)
263 	      {
264 	      case KEY_LEFT:
265 		focus--;
266 		break;
267 	      case KEY_RIGHT:
268 		focus++;
269 		break;
270 	      }
271 	  break;
272 
273 	case 1:		/* selectedfilts */
274 	  if (scrollmenu_stdkeys (in_ch, selectedfilts) >= 0)
275 	    {
276 	      if (number_of_filters > 0)
277 		;
278 	      param_screen (
279 			     parampointerarray[selectedfilts->selected],
280 			     filter_type[selectedfilts->selected]);
281 	    }
282 	  else
283 	    switch (in_ch)
284 	      {
285 	      case 'u':
286 	      case 'U':
287 		if (selectedfilts->selected > 0)
288 		  {
289 		    helpcharptr = selectedfilts->items[
290 					       selectedfilts->selected - 1];
291 		    selectedfilts->items[selectedfilts->selected - 1] =
292 		      selectedfilts->items[selectedfilts->selected];
293 		    selectedfilts->items[selectedfilts->selected] =
294 		      helpcharptr;
295 
296 		    helpint = filter_type[selectedfilts->selected - 1];
297 		    filter_type[selectedfilts->selected - 1] =
298 		      filter_type[selectedfilts->selected];
299 		    filter_type[selectedfilts->selected] =
300 		      helpint;
301 
302 		    helpparampointer = parampointerarray[
303 					       selectedfilts->selected - 1];
304 		    parampointerarray[selectedfilts->selected - 1] =
305 		      parampointerarray[selectedfilts->selected];
306 		    parampointerarray[selectedfilts->selected] =
307 		      helpparampointer;
308 
309 		    selectedfilts->selected--;
310 		  }
311 		break;
312 
313 	      case 'd':
314 	      case 'D':
315 		if (selectedfilts->selected <
316 		    number_of_filters - 1)
317 		  {
318 		    helpcharptr = selectedfilts->items[
319 					       selectedfilts->selected + 1];
320 		    selectedfilts->items[selectedfilts->selected + 1] =
321 		      selectedfilts->items[selectedfilts->selected];
322 		    selectedfilts->items[selectedfilts->selected] =
323 		      helpcharptr;
324 
325 		    helpint = filter_type[selectedfilts->selected + 1];
326 		    filter_type[selectedfilts->selected + 1] =
327 		      filter_type[selectedfilts->selected];
328 		    filter_type[selectedfilts->selected] =
329 		      helpint;
330 
331 		    helpparampointer = parampointerarray[
332 					       selectedfilts->selected + 1];
333 		    parampointerarray[selectedfilts->selected + 1] =
334 		      parampointerarray[selectedfilts->selected];
335 		    parampointerarray[selectedfilts->selected] =
336 		      helpparampointer;
337 
338 		    selectedfilts->selected++;
339 		  }
340 		break;
341 
342 	      case KEY_BACKSPACE:
343 	      case 127:
344 	      case 'r':
345 	      case 'R':
346 		if (number_of_filters > 0)
347 		  {
348 		    free (parampointerarray[selectedfilts->selected]);
349 
350 		    for (i = selectedfilts->selected;
351 			 i < number_of_filters - 1; i++)
352 		      {
353 			selectedfilts->items[i] =
354 			  selectedfilts->items[i + 1];
355 
356 			filter_type[i] = filter_type[i + 1];
357 
358 			parampointerarray[i] =
359 			  parampointerarray[i + 1];
360 		      }
361 		    number_of_filters--;
362 		    selectedfilts->number = number_of_filters;
363 		  }
364 		break;
365 
366 	      case KEY_LEFT:
367 		focus--;
368 		break;
369 	      case KEY_RIGHT:
370 		focus++;
371 		break;
372 	      }
373 	  break;
374 
375 	case 2:		/* Use tracksplitting data */
376 	  switch (in_ch)
377 	    {
378 	    case KEY_ENTER:
379 	    case 13:
380 	    case ' ':
381 	    case 'x':
382 	    case 'X':
383 	      *usetracktimes = 1 - *usetracktimes;
384 	      if (*usetracktimes)
385 		*usebeginendtime = 0;
386 	      break;
387 
388 	    case KEY_LEFT:
389 	    case KEY_UP:
390 	      focus--;
391 	      break;
392 	    case KEY_RIGHT:
393 	    case KEY_DOWN:
394 	      focus++;
395 	      break;
396 	    }
397 	  break;
398 
399 	case 3:		/* Use begin/end times */
400 	  switch (in_ch)
401 	    {
402 	    case KEY_ENTER:
403 	    case 13:
404 	    case ' ':
405 	    case 'x':
406 	    case 'X':
407 	      *usebeginendtime = 1 - *usebeginendtime;
408 	      if (*usebeginendtime)
409 		*usetracktimes = 0;
410 	      break;
411 
412 	    case KEY_LEFT:
413 	    case KEY_UP:
414 	      focus--;
415 	      break;
416 	    case KEY_RIGHT:
417 	    case KEY_DOWN:
418 	      focus++;
419 	      break;
420 	    }
421 	  break;
422 
423 	case 4:		/* begin time */
424 	  stringinput_stdkeys (in_ch, &begintimestring);
425 	  switch (in_ch)
426 	    {
427 	    case KEY_ENTER:
428 	    case 13:
429 	      strcpy (tempstring, begintimestring.string);
430 	      if (!hmsf2fsec (tempstring, &tempdouble))
431 		{
432 		  error_window ("Enter the time in the format hours:\
433 minutes:seconds.fractions, for example 0:04:26.740");
434 		  begintimestring.cursorpos =
435 		    strlen (begintimestring.string);
436 		}
437 	      else
438 		{
439 		  *begintime = tempdouble;
440 		  fsec2hmsf (tempdouble, begintimestring.string);
441 		  begintimestring.cursorpos =
442 		    strlen (begintimestring.string);
443 		  focus++;
444 		}
445 	      break;
446 
447 	    case KEY_UP:
448 	      focus--;
449 	      break;
450 	    case KEY_DOWN:
451 	      focus++;
452 	      break;
453 	    }
454 	  break;
455 
456 	case 5:		/* end time */
457 	  stringinput_stdkeys (in_ch, &endtimestring);
458 	  switch (in_ch)
459 	    {
460 	    case KEY_ENTER:
461 	    case 13:
462 	      strcpy (tempstring, endtimestring.string);
463 	      if (!hmsf2fsec (tempstring, &tempdouble))
464 		{
465 		  error_window ("Enter the time in the format hours:\
466 minutes:seconds.fractions, for example 0:04:26.740");
467 		  endtimestring.cursorpos =
468 		    strlen (endtimestring.string);
469 		}
470 	      else
471 		{
472 		  *endtime = tempdouble;
473 		  fsec2hmsf (tempdouble, endtimestring.string);
474 		  endtimestring.cursorpos =
475 		    strlen (endtimestring.string);
476 		  focus = 8;
477 		}
478 	      break;
479 
480 	    case KEY_UP:
481 	      focus--;
482 	      break;
483 	    case KEY_DOWN:
484 	      focus++;
485 	      break;
486 	    }
487 	  break;
488 
489 
490 	case 6:		/* < Previous */
491 	  if (in_ch == KEY_ENTER || in_ch == 13)
492 	    {
493 	      returnval = 1;
494 	      dont_stop = FALSE;
495 	    }
496 	  else
497 	    switch (in_ch)
498 	      {
499 	      case KEY_LEFT:
500 	      case KEY_UP:
501 		focus--;
502 		break;
503 	      case KEY_RIGHT:
504 	      case KEY_DOWN:
505 		focus++;
506 		break;
507 	      }
508 	  break;
509 
510 	case 7:		/* Cancel */
511 	  if (in_ch == KEY_ENTER || in_ch == 13)
512 	    {
513 	      returnval = 0;
514 	      dont_stop = FALSE;
515 	    }
516 	  else
517 	    switch (in_ch)
518 	      {
519 	      case KEY_LEFT:
520 	      case KEY_UP:
521 		focus--;
522 		break;
523 	      case KEY_RIGHT:
524 	      case KEY_DOWN:
525 		focus++;
526 		break;
527 	      }
528 	  break;
529 
530 	case 8:		/* Next > */
531 	  if (in_ch == KEY_ENTER || in_ch == 13)
532 	    {
533 	      if (number_of_filters < 1)
534 		{
535 		  error_window ("No filters have been selected.");
536 		  focus = 0;
537 		  break;
538 		}
539 
540 	      strcpy (tempstring, begintimestring.string);
541 	      if (!hmsf2fsec (tempstring, &tempdouble))
542 		{
543 		  error_window ("Enter the begin time in the format hours:\
544 minutes:seconds.fractions, for example 0:04:26.740");
545 		  begintimestring.cursorpos =
546 		    strlen (begintimestring.string);
547 		  focus = 4;
548 		  break;
549 		}
550 
551 	      *begintime = tempdouble;
552 
553 	      strcpy (tempstring, endtimestring.string);
554 	      if (!hmsf2fsec (tempstring, &tempdouble))
555 		{
556 		  error_window ("Enter the end time in the format hours:\
557 minutes:seconds.fractions, for example 0:04:26.740");
558 		  endtimestring.cursorpos =
559 		    strlen (endtimestring.string);
560 		  focus = 5;
561 		  break;
562 		}
563 
564 	      *endtime = tempdouble;
565 
566 	      if (*begintime > *endtime)
567 		{
568 		  error_window ("The begin time is larger than the end time.");
569 		  fsec2hmsf (*begintime, begintimestring.string);
570 		  begintimestring.cursorpos =
571 		    strlen (begintimestring.string);
572 		  fsec2hmsf (*endtime, endtimestring.string);
573 		  endtimestring.cursorpos =
574 		    strlen (endtimestring.string);
575 		  focus = 4;
576 		  break;
577 		}
578 
579 	      returnval = 2;
580 	      dont_stop = FALSE;
581 	    }
582 	  else
583 	    switch (in_ch)
584 	      {
585 	      case KEY_LEFT:
586 	      case KEY_UP:
587 		focus--;
588 		break;
589 	      case KEY_RIGHT:
590 	      case KEY_DOWN:
591 		focus++;
592 		break;
593 	      }
594 	  break;
595 
596 	}			/* switch(focus) */
597 
598       if (in_ch == 9)		/* TAB */
599 	focus++;
600 
601       if (in_ch == 27)
602 	dont_stop = FALSE;
603 
604       if (focus > 8)
605 	focus -= 9;
606       if (focus < 0)
607 	focus += 9;
608     }
609   while (dont_stop);
610 
611   return returnval;
612 }
613